#include using namespace std; #define modulo 1000000007 #define mod(mod_x) ((((long long)mod_x)+modulo)%modulo) #define Inf 1000000000000000 struct lca{ vector depth;//depth[i] 頂点iの深さ vector> parents;//parents[i][j] 頂点iから2^j個上の親 int max_j = 30; lca(){ } lca(int n,vector> &E){ depth.assign(E.size(),-1); parents.assign(E.size(),vector(max_j,-1)); stack s; s.push(n); depth[n] = 0; while(s.size()!=0){ int k = s.top(); s.pop(); for(int i=0;i=0;i--){ if(parents[u][i]!=parents[v][i]){ u = parents[u][i]; v = parents[v][i]; } } return parents[u][0]; } int get_distance(int u,int v){ return depth[u]+depth[v]-2*depth[query(u,v)]; } }; template struct segtree{ //元データx[i]はv[n+i] //v[i]の親はv[i/2],子はv[i*2]とv[i*2+1] F func; vector v; int n; const T init_value = -1; segtree(int sz,F f):func(f){ n=1; while(true){ if(n>=sz)break; n*=2; } v.resize(2*n,init_value); for(int i=n-1;i>=0;i--){ v[i]=func(v[i<<1],v[(i<<1)+1]); } } segtree(vector &x,F f):func(f){ n=1; while(true){ if(n>=x.size())break; n*=2; } v.resize(2*n,init_value); for(int i=0;i=0;i--){ v[i]=func(v[i<<1],v[(i<<1)+1]); } } void update(int x,T val){ x+=n; v[x]=val; while(x>0){ x>>=1; v[x]=func(v[x<<1],v[(x<<1)+1]); } } //区間[l,r)におけるクエリ処理 T query(int l,int r){ if(l>=r)return init_value; l+=n; r+=n; T res1 = init_value; T res2 = init_value; while(true){ if(l&1){ res1=func(res1,v[l++]); } if(r&1){ res2=func(v[--r],res2); } if(l>=r)break; l>>=1;r>>=1; } return func(res1,res2); } void show(){ int n = 1; for(int i=1;i>N>>K>>Q; vector C(N); vector A(K); for(int i=0;i>C[i]; for(int i=0;i>A[i]; A[i]--; } vector> E(N,vector()); for(int i=0;i>u>>v; u--;v--; E[v].push_back(u); } L = *(new lca(0,E)); auto f = [](int a,int b){ if(a==-1)return b; if(b==-1)return a; return L.query(a,b); }; dfs(E,0,C); segtree seg(A,f); for(int i=0;i>T>>X>>Y; X--;Y--; if(T==1){ seg.update(X,Y); } else{ cout<