제출 #342301

#제출 시각아이디문제언어결과실행 시간메모리
342301ogibogi2004Birthday gift (IZhO18_treearray)C++14
100 / 100
1903 ms97644 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+6;
set<int>s1[MAXN];
set<int>s2[MAXN];
vector<int>g[MAXN];
int a[MAXN],n,m,q;
int dp[MAXN][20],depth[MAXN];
void dfs(int u,int p)
{
	dp[u][0]=p;
	depth[u]=depth[p]+1;
	for(auto v:g[u])
	{
		if(v==p)continue;
		dfs(v,u);
	}
}
void precompute()
{
	for(int s=1;s<20;s++)
	{
		for(int i=1;i<=n;i++)
		{
			dp[i][s]=dp[dp[i][s-1]][s-1];
		}
	}
}
int lca(int x,int y)
{
	if(depth[x]<depth[y])swap(x,y);
	int diff=depth[x]-depth[y];
	for(int i=0;i<20;i++)
	{
		if(diff&(1<<i))
		{
			x=dp[x][i];
		}
	}
	if(x==y)return x;
	for(int i=19;i>=0;i--)
	{
		if(dp[x][i]!=dp[y][i])
		{
			x=dp[x][i];
			y=dp[y][i];
		}
	}
	return dp[x][0];
}
int main()
{
	cin>>n>>m>>q;
	for(int i=1;i<n;i++)
	{
		int u,v;
		cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dfs(1,0);
	precompute();
	for(int i=1;i<=n;i++)
	{
		s1[i].insert(MAXN);
		s2[i].insert(MAXN);
	}
	for(int i=1;i<=m;i++)
	{
		cin>>a[i];
		s1[a[i]].insert(i);
	}
	for(int i=1;i<m;i++)
	{
		s2[lca(a[i],a[i+1])].insert(i);
	}
	for(int i=1;i<=q;i++)
	{
		int t;
		cin>>t;
		if(t==1)
		{
			int v,pos;
			cin>>pos>>v;
			if(pos!=m)
			{
				s2[lca(a[pos],a[pos+1])].erase(pos);
			}
			if(pos!=1)
			{
				s2[lca(a[pos-1],a[pos])].erase(pos-1);
			}
			s1[a[pos]].erase(pos);
			a[pos]=v;
			if(pos!=m)
			{
				s2[lca(a[pos],a[pos+1])].insert(pos);
			}
			if(pos!=1)
			{
				s2[lca(a[pos-1],a[pos])].insert(pos-1);
			}
			s1[a[pos]].insert(pos);
		}
		else
		{
			int l,r,v;
			cin>>l>>r>>v;
			int xd=(*s1[v].lower_bound(l));
			if(xd<=r)
			{
				cout<<xd<<" "<<xd<<endl;
				continue;
			}
			xd=(*s2[v].lower_bound(l));
			if(xd<r)
			{
				cout<<xd<<" "<<xd+1<<endl;
				continue;
			}
			cout<<"-1 -1\n";
		}
	}
return 0;
}
/*
5 4 4
1 2
3 1
3 4
5 3
4 5 2 3
2 1 3 1
1 3 5
2 3 4 5
2 1 3 1
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...