Submission #342704

#TimeUsernameProblemLanguageResultExecution timeMemory
342704David_MBirthday gift (IZhO18_treearray)C++14
100 / 100
1482 ms118320 KiB
#include <bits/stdc++.h> 
#define ll long long
#define F first
#define S second
#define FF first.first
#define FS first.second
#define pb push_back
using namespace std;
const ll N=200006, INF=1e18;
     
ll pos, l, r, n, m, t, a[N], b[N], h[N], p[20][N], q, k, x, y;
vector <ll> v[N];
set <ll> s[N], S[N];

void build(){
    for (int i=1; i<=19; i++)
        for (int j=1; j<=n; j++)
        	p[i][j]=-1;
        	
	for (int i=1; i<=19; i++)
		for (int j=1; j<=n; j++)
			if(p[i-1][j]!=-1) p[i][j]=p[i-1][p[i-1][j]];
}  

void dfs(int x, int pa){
	s[x].insert(INF),
	S[x].insert(INF);
	p[0][x]=pa;
	for (int i=0; i<v[x].size(); i++){
		int y=v[x][i];
		if(y==pa)continue;
		h[y]=h[x]+1;
		dfs(y, x);
	}
}

int lca(int x, int y){
	if(h[y]<h[x])swap(x, y);
	int l=h[y]-h[x];
	
	for (int i=19; i>=0; i--) if((l>>i)&1)y=p[i][y];
	if(x==y)return x;
	
	for (int i=19; i>=0; i--) if(p[i][x]!=p[i][y])x=p[i][x],y=p[i][y];
	return p[0][x];
}

int main(){ios_base::sync_with_stdio(false), cin.tie(0);

	cin>>n>>m>>q;
	
	for (int i=1; i<n; i++)
		cin>>x>>y,
		v[x].pb(y),
		v[y].pb(x);
	
	dfs(1, 1);
	build();
	
	for (int i=1; i<=m; i++){
		cin>>a[i];
		S[a[i]].insert(i);
		if(i==1)continue;
		k=lca(a[i], a[i-1]);
		b[i]=k;
		s[k].insert(i);
	}
	
	while(q--){
		cin>>t;
		if(t==1){
			cin>>pos>>x;
			if(pos>1)s[b[pos]].erase(pos);
			if(pos<m)s[b[pos+1]].erase(pos+1);
			S[a[pos]].erase(pos);
			a[pos]=x;
			S[a[pos]].insert(pos);
			if(pos>1)k=lca(a[pos], a[pos-1]), b[pos]=k,  s[k].insert(pos);
			if(pos<m)k=lca(a[pos], a[pos+1]), b[pos+1]=k,s[k].insert(pos+1);
		}else{
			cin>>l>>r>>x;
			k=*(s[x].upper_bound(l));
			if(k<=r)cout<<k-1<<" "<<k<<'\n';
			else{
				k=*(S[x].lower_bound(l));
				if(k<=r)cout<<k<<" "<<k<<'\n';
				else cout<<"-1 -1\n";
			}
		}
	}
	
}

Compilation message (stderr)

treearray.cpp: In function 'void build()':
treearray.cpp:16:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
   16 |     for (int i=1; i<=19; i++)
      |     ^~~
treearray.cpp:20:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
   20 |  for (int i=1; i<=19; i++)
      |  ^~~
treearray.cpp: In function 'void dfs(int, int)':
treearray.cpp:29:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |  for (int i=0; i<v[x].size(); i++){
      |                ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...