이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> ii;
const int maxn=2e5+5;
int n,m,q;
vector<int> AdjList[maxn];
int up[maxn][20];
int in[maxn];
int out[maxn];
int arr[maxn];
int timer=0;
bool ancestor(int a, int b) {
if(!a) return 1;
if(!b) return 0;
return in[a]<=in[b]&&out[a]>=out[b];
}
void dfs(int s, int p=0) {
in[s]=++timer;
//cout<<"in "<<s<<" = "<<in[s]<<endl;
up[s][0]=p;
for(int i=1 ; i<20 ; i++) up[s][i]=up[up[s][i-1]][i-1];
for(int u: AdjList[s]) {
if(u==p) continue;
dfs(u,s);
}
out[s]=timer;
//cout<<"out "<<s<<" = "<<out[s]<<endl;
}
int lca(int u, int v) {
//cout<<"lca "<<u<<" "<<v<<" = ";
if(ancestor(u,v)) return u;
if(ancestor(v,u)) return v;
for(int i=19 ; i>=0 ; i--) {
if(!ancestor(up[u][i],v)) u=up[u][i];
}
//cout<<up[u][0]<<endl;
return up[u][0];
}
// build segment tree
int lc[maxn]; // between two adjacent in array
set<ii> S;
set<ii> V;
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n>>m>>q;
for(int i=1 ; i<n ; i++) {
int u,v;
cin>>u>>v;
AdjList[u].push_back(v);
AdjList[v].push_back(u);
}
dfs(1);
for(int i=1 ; i<=m ; i++) {
cin>>arr[i];
V.insert(ii(arr[i],i));
}
for(int i=1 ; i<m ; i++) {
lc[i]=lca(arr[i],arr[i+1]);
S.insert(ii(lc[i],i));
// cout<<"S "<<lc[i]<<" "<<i<<endl;
}
while(q--) {
int type,l,r,v;
cin>>type;
if(type==2) {
cin>>l>>r>>v;
auto it1=V.lower_bound(ii(v,l));
auto it=S.lower_bound(ii(v,l));
if(it1!=V.end()) {
if((*it1).first==v&&(*it1).second<=r) {
cout<<(*it1).second<<' '<<(*it1).second<<'\n';
continue;
}
}
if(m==1) {
cout<<"-1 -1\n";
continue;
}
if(it==S.end()) {
cout<<"-1 -1\n";
continue;
}
else {
//cout<<"find = "<<(*it).first<<" "<<(*it).second<<endl;
if((*it).first!=v) {
cout<<"-1 -1\n";
continue;
}
else if((*it).second>=r) {
cout<<"-1 -1\n";
continue;
}
else cout<<(*it).second<<' '<<(*it).second+1<<'\n';
}
}
else {
cin>>l>>v;
auto it1=V.find(ii(arr[l],l));
V.erase(it1);
arr[l]=v;
V.insert(ii(arr[l],l));
if(l!=n) {
auto it=S.find(ii(lc[l],l));
S.erase(it);
lc[l]=lca(arr[l],arr[l+1]);
//cout<<"lc "<<l<<" = "<<lc[l]<<endl;
S.insert(ii(lc[l],l));
}
if(l!=1) {
auto it=S.find(ii(lc[l-1],l-1));
S.erase(it);
lc[l-1]=lca(arr[l-1],arr[l]);
//cout<<"lc "<<l-1<<" = "<<lc[l-1]<<endl;
S.insert(ii(lc[l-1],l-1));
}
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |