Submission #1036980

#TimeUsernameProblemLanguageResultExecution timeMemory
1036980goduadzesabaBirthday gift (IZhO18_treearray)C++17
0 / 100
5 ms29356 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define fr first
#define sc second
const int N=2e5+5,mod=1e9+7;
int t,n,m,q,x,y,z,a1,a2,cur,tin[N],tout[N],par[N][20],a[N],b[N];
vector <int> v[N]; set <int> s1[N],s2[N];
void dfs (int g,int p){
	cur++; tin[g]=cur;
	par[g][0]=p;
	for (int i=1; i<20; i++)
		par[g][i]=par[par[g][i-1]][i-1];
	for (int i:v[g]){
		if (i==p) continue;
		dfs(i,g);
	}
	tout[g]=cur;
}
bool ispar(int a,int b){
	if (tin[a]<=tin[b] && tout[a]>=tout[b])
		return 1;
	return 0;
}
int lca(int a,int b){
	if (ispar(a,b)) return a;
	for (int i=19; i>=0; i--)
		if (par[a][i]>0 && !ispar(par[a][i],b))
			a=par[a][i];
	return par[a][0];
}
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++){
		cin>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	dfs(1,0);
	for (int i=1; i<=m; i++){
		cin>>a[i];
		s1[a[i]].insert(i);
	}
	for (int i=1; i<m; i++){
		b[i]=lca(a[i],a[i+1]);
		s2[b[i]].insert(i);
	}
	while (q--){
		cin>>t;
		if (t==1){
			cin>>x>>y;
			s1[a[x]].erase(x);
			a[x]=y;
			s1[a[x]].insert(x);
			
			s2[b[x]].erase(x);
			b[x]=lca(a[x],a[x+1]);
			s2[b[x]].insert(x);
			
			s2[b[x-1]].erase(x-1);
			b[x-1]=lca(a[x-1],a[x]);
			s2[b[x-1]].insert(x-1);
		}
		else{
			cin>>x>>y>>z;
			a1=a2=n+1;
			if (s1[z].lower_bound(x)!=s1[z].end())
				a1=*s1[z].lower_bound(x);
			if (s2[z].lower_bound(x)!=s2[z].end())
				a2=*s2[z].lower_bound(x);
			if (a1<=y) cout<<a1<<" "<<a1;
			else if (a2<y) cout<<a2<<" "<<a2+1;
			else cout<<"-1 -1";
			cout<<"\n";
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...