Submission
Status:
PPPPPPPPPP
Subtask/Task Score:
100/100
Score: 100
User: Dormon
Problemset: ถังดักนิวทริโน
Language: cpp
Time: 0.002 second
Submitted On: 2025-05-23 12:54:23
#include <bits/stdc++.h>
using namespace std;
const int LOG = 10;
vector<vector<int>> pa;
vector<int> depth;
void init(int n){
pa.assign(LOG, vector<int>(n + 1));
depth.resize(n + 1);
}
int lca(int u, int v){
if (depth[u] < depth[v]) swap(u, v);
int d = depth[u] - depth[v];
for (int i = 0;(1 << i) <= d;i++)
if (d & (1 << i))
u = pa[i][u];
if (u == v) return u;
for (int i = LOG - 1;i >= 0;i--){
if (pa[i][u] != pa[i][v]){
u = pa[i][u];
v = pa[i][v];
}
}
return pa[0][u];
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, m;
cin >> n >> m;
init(n);
stack<int> st;
vector<int> l(n + 1), r(n + 1);
for (int i = 1;i <= n;i++){
cin >> l[i] >> r[i];
while (!st.empty() && l[i] > r[st.top()])
st.pop();
int dep = st.size();
if (dep == 0) pa[0][i] = 0;
else pa[0][i] = st.top();
depth[i] = dep;
st.push(i);
}
for (int i = 1;i < LOG;i++)
for (int j = 1;j <= n;j++)
pa[i][j] = pa[i - 1][pa[i - 1][j]];
vector<int> poi(m);
for (auto &e:poi)
cin >> e;
vector<int> ans;
int j = 0;
for (int i = 0;i < m;i = j){
if (i == m - 1){
ans.push_back(poi[i]);
break;
}
int u = lca(poi[i], poi[i + 1]);
j = i + 1;
while (j < m && lca(u, poi[j]) != 0){
u = lca(u, poi[j]);
j++;
}
if (u == 0) u = poi[i];
ans.push_back(u);
}
cout << ans.size() << '\n';
for (auto e:ans)
cout << e << ' ';
cout << '\n';
return 0;
}