Submission
Status:
PPPPPPPPPP
Score: 100
User: mydKN
Problemset: ถังดักนิวทริโน
Language: cpp
Time: 0.003 second
Submitted On: 2024-12-05 22:06:21
#include<bits/stdc++.h>
using namespace std;
const int maxn = 310;
const int LOG = 9;
int n, m;
int arr[maxn];
int parent[maxn];
int l[maxn], r[maxn];
vector<int> root;
vector<int> vec[maxn];
int height[maxn];
int dp[maxn][LOG];
void preprocessLCA(){
for(int i=1;i<=n;++i){
dp[i][0] = parent[i];
}
for(int j=1;(1<<j)<=n;++j){
for(int i=1;i<=n;++i){
dp[i][j] = dp[dp[i][j-1]][j-1];
}
}
}
int LCA(int u, int v){
if(height[u] < height[v]) swap(u, v);
int diff = height[u] - height[v];
for(int i=LOG-1;i>=0;--i){
if((1<<i) & diff){
u = dp[u][i];
}
}
if(u == v) return u;
for(int i =LOG-1;i>=0;--i){
if(dp[u][i] != dp[v][i]){
u = dp[u][i];
v = dp[v][i];
}
}
return parent[u];
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin >> n >> m;
cin >> l[1] >> r[1];
int cnt = 0;
int nowparent = 1;
parent[1] = 1;
root.emplace_back(1);
for(int i=2;i<=n;++i){
cin >> l[i] >> r[i];
if(l[i] > r[nowparent]){
nowparent = i;
root.emplace_back(i);
cnt = -1;
}
else height[i] = height[nowparent] + 1;
parent[i] = nowparent;
int j = cnt;
while(j > 0){
if(l[i] > l[nowparent+j] && r[i] < r[nowparent+j]){
parent[i] = nowparent + j;
height[i] = height[nowparent + j] + 1;
break;
}
--j;
}
++cnt;
}
preprocessLCA();
int res = 0;
for(int i=0;i<m;++i){
int x;
cin >> x;
for(auto e : root){
if(l[x] >= l[e] && r[x] <= r[e]){
if(vec[e].empty()) res++;
vec[e].emplace_back(x);
}
}
}
cout << res << "\n";
int lca;
for(int i=0;i<n;++i){
if(!vec[i].empty()){
lca = vec[i][0];
for(int j=1;j<vec[i].size();++j){
lca = LCA(lca, vec[i][j]);
}
cout << lca << " ";
}
}
// for(int i=0;i<n;++i){
// if(!vec[i].empty()){
// cout << i << " : ";
// for(auto e : vec[i]) cout << e << " ";
// cout << "\n";
// }
// }
// for(int i=1;i<=n;++i) cout << i << " ";
// cout << "\n";
// for(int i=1;i<=n;++i) cout << parent[i] << " ";
// cout << "\n";
// for(int i=1;i<=n;++i) cout << height[i] << " ";
// cout << "\n";
// for(auto e : root) cout << e << " ";
}