Submission #1264657

#TimeUsernameProblemLanguageResultExecution timeMemory
1264657shiori_chanBirthday gift (IZhO18_treearray)C++17
100 / 100
822 ms152488 KiB
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define eb emplace_back
#define pu push
#define ins insert
#define fi first
#define se second
#define all(a) a.begin(),a.end()
#define bruh ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fu(x,a,b) for (auto x=a;x<=b;x++)
#define fd(x,a,b) for (auto x=a;x>=b;x--)
#define int ll

using namespace std;

typedef pair<int, int> ii;
const int N = 5e5+5;
const int M = 20;
const int B = 750;
const int mod = 1e9+7;
const int inf = 1e18;
using cd = complex<double>;
const long double PI = acos(-1);
int power(int a,int b) {ll x = 1;if (a >= mod) a%=mod; while (b) {if (b & 1) x = x*a % mod;a = a*a % mod;b>>=1;}return x;} 

int n,m,q;
vector<int> adj[N];
vector<int> euler;
int tin[N], tout[N];
int h[N], a[N];
multiset<ii> s[N];

int spt[M][2000005], lg[2000005];

void buildspt() 
{
	lg[1] = 0;
	for (int i = 2; i < N; i++) lg[i] = lg[i/2] + 1;
	for (int i = 0; i < euler.size(); i++) spt[0][i] = euler[i];
	for (int i = 1; i < M; i++) 
	{
		for (int j = 0; j+(1<<i)-1 < euler.size(); j++) spt[i][j] = (h[spt[i-1][j]] < h[spt[i-1][j+(1<<(i-1))]] ? spt[i-1][j] : spt[i-1][j+(1<<(i-1))]);
	}
}

int lca(int u, int v) 
{
	if (tin[u] > tin[v]) swap(u,v);
	int l = tin[u], r = tin[v];
	int i = lg[r-l+1];
	return (h[spt[i][l]] < h[spt[i][r-(1<<i)+1]] ? spt[i][l] : spt[i][r-(1<<i)+1]);
}

void dfs(int u, int p) 
{
	tin[u] = euler.size();
	euler.pb(u);
	for (auto v : adj[u]) 
	{
		if (v == p) continue;
		h[v] = h[u] + 1;
		dfs(v, u);
		euler.pb(u);
	}
	tout[u] = euler.size()-1;
}

void solve()
{
	cin>>n>>m>>q;
	for (int i = 1; i < n; i++) 
	{
		int u,v; cin>>u>>v;
		adj[u].pb(v); adj[v].pb(u);
	}
	dfs(1, 0);
	buildspt();
	for (int i = 1; i <= m; i++) cin>>a[i], s[a[i]].insert({i, i});
	for (int i = 1; i < m; i++) 
	{
		s[lca(a[i], a[i+1])].insert({i, i+1});
		// cout<<lca(a[i], a[i+1])<<" ";
	}
	// cout<<endl;
	while (q--) 
	{
		int type;
		cin>>type;
		if (type == 1) 
		{
			int i, v;
			cin>>i>>v;
			if (i > 1) s[lca(a[i-1], a[i])].erase({i-1, i});
			if (i < m) s[lca(a[i], a[i+1])].erase({i, i+1});
			s[a[i]].erase({i, i});
			a[i] = v;
			if (i > 1) s[lca(a[i-1], a[i])].insert({i-1, i});
			if (i < m) s[lca(a[i], a[i+1])].insert({i, i+1});
			s[a[i]].insert({i, i});
		} else 
		{
			int l,r,v;
			cin>>l>>r>>v;
			auto it = s[v].lower_bound({l, 0});
			if (it == s[v].end()) 
			{
				cout<<"-1 -1"<<endl;
				continue;
			}
			ii pos = *it;
			if (pos.se <= r) cout<<pos.fi<<" "<<pos.se<<endl;
			else cout<<"-1 -1"<<endl;
		}
	}
}

/*	
Go through the mistakes you usually make and revise your code, for god's sake...
*/

signed main()
{
	//freopen("input.inp","r",stdin);
	//freopen("output.inp","w",stdout);
	int t = 1;
	// cin>>t;
	while (t--)
	{
		solve();
		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...