Submission

Status:

PPPPPPPPPP

Subtask/Task Score:

100/100

Score: 100

User: Dormon

Problemset: ถังดักนิวทริโน

Language: cpp

Time: 0.002 second

Submitted On: 2025-05-23 17:38:40

#include <iostream>
#include <vector>
#include <numeric>

using namespace std;

template<typename T> istream &operator >> (istream &in, vector<T> &v){
    for (auto &e:v)
        in >> e;
    return in;
}
template<typename T> ostream &operator << (ostream &out, vector<T> v){
    for (auto &e:v)
        out << e << ' ';
    return out;
}

const int N = 303;

vector<vector<int>> adj;
vector<int> pa, parent, have;

void init(int n){
    adj.assign(n + 1, vector<int>());
    pa.resize(n + 1);
    iota(pa.begin(), pa.end(), 0);
    parent.resize(n + 1);
    have.resize(n + 1);
}

int f(int i){
    if (pa[i] == i) return i;
    return pa[i] = f(pa[i]);
}

bool untie(int u, int v){
    int fu = f(u), fv = f(v);
    if (fu == fv) return false;
    pa[fv] = fu;
    return true;
}

pair<int, int> dfs(int u, int k){
    // cout << "u, k : " << u << ' ' << k << '\n'; 
    int cnt = have[u];
    for (auto v:adj[u]){
        pair<int, int> c = dfs(v, k);
        if (c.first != -1) return c;
        cnt += c.second;
    }
    if (cnt == k) return {u, cnt};
    return {-1, cnt};
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int n, m;
    cin >> n >> m;

    init(n);

    vector<int> l(n + 1), r(n + 1);
    for (int i = 1;i <= n;i++)
        cin >> l[i] >> r[i];
        
    for (int i = 1;i <= n;i++){
        pa[i] = i;
        for (int j = i - 1;j >= 1;j--){
            if (l[j] < l[i] && r[j] > r[i]){
                adj[j].push_back(i);
                untie(j, i);
                break;
            }
        }
    }
        
    vector<int> poi(m), ans;
    for (auto &e:poi){
        cin >> e;
        have[e] = 1;
    }

    int j = 0;
    for (int i = 0;i < m;i = j + 1){
        // cout << "i = " << i << '\n';    
        j = i;
        while (j < m && f(poi[i]) == f(poi[j + 1]))
            j++;
        int op = j - i + 1;
        int u = dfs(f(poi[i]), op).first; // dfs from root
        ans.push_back(u);
    }

    cout << ans.size() << '\n';
    for (auto e:ans)
        cout << e << ' ';
    cout << '\n';
}