Submission #1235132

#TimeUsernameProblemLanguageResultExecution timeMemory
1235132nlsosadBirthday gift (IZhO18_treearray)C++20
56 / 100
161 ms53032 KiB
#include <bits/stdc++.h>
using namespace std;
vector<int> adj[200001];
int bin[200001][18];
int a[200001];
int depth[200001];
int b[200001];
set<int> la[200001], lb[20001];
void dfs(int i, int p){
	for (int j:adj[i]){
		if(j!=p){
			depth[j] = depth[i] + 1;
			bin[j][0]= i;
			dfs(j, i);
		}
	}
}
int lca(int u, int v){
	if(depth[u] < depth[v]){
		swap(u, v);
	}
	int diff = depth[u] - depth[v];
	for (int i = 0;i<18;++i){
		if(diff & (1<<i)){
			u = bin[u][i];
		}
	}
	if(u==v)return u;
	for (int i=17;i>=0;--i){
		if(bin[u][i]!=bin[v][i]){
			u = bin[u][i];
			v = bin[v][i];
		}
	}
	return bin[u][0];
}
int main(){
	int n, m ,q;
	cin >> n >> m >> q;
	for (int i = 1;i<n;++i){
		int u, v;
		cin >> u >> v;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	for (int i = 1;i<=m;++i){
		cin >> a[i];
	}
	dfs(1, 0);
	for (int j = 1;j<18;++j){
		for (int i = 1;i<=n;++i){
			bin[i][j] = bin[bin[i][j-1]][j-1];
		}
	}
	for (int i = 1;i<m;++i){
		b[i] = lca(a[i], a[i+1]);
		la[a[i]].insert(i);
		lb[b[i]].insert(i);
	}
	la[a[m]].insert(m);
	while(q--){
		int t;
		cin >> t;
		if(t==1){
			int pos, v;
			cin >> pos >> v;
			la[a[pos]].erase(pos);
			if(pos < n){
				lb[b[pos]].erase(pos);
			}
			if(pos>1){
				lb[b[pos-1]].erase(pos-1);
			}
			a[pos] = v;
			la[a[pos]].insert(pos);
			if(pos < n){
				b[pos] = lca(a[pos], a[pos+1]);
				lb[b[pos]].insert(pos);
			}
			if(pos>1){
				b[pos-1] = lca(a[pos-1], a[pos]);
				lb[b[pos-1]].insert(pos-1);
			}
		}else{
			int l, r, v;
			cin >> l >> r >> v;
			int x = -1, y = -1;
			auto it = la[v].lower_bound(l);
			if(it!=la[v].end() and *it <= r){
				x = *it;
				y = *it;
			}else{
				it = lb[v].lower_bound(l);
				if(it!=lb[v].end() and *it < r){
					x = *it;
					y = *it + 1;
				}
			}
			cout << x << ' ' << y << '\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...