제출 #522716

#제출 시각아이디문제언어결과실행 시간메모리
522716inluminasBirthday gift (IZhO18_treearray)C++17
100 / 100
1197 ms86444 KiB
#include"bits/stdc++.h"
using namespace std;
 
#define ll long long
#define endl "\n"
#define fastio ios_base::sync_with_stdio(false)
#define inf LLONG_MAX

const int lmt=2e5+10;
vector<int>adj[lmt];
int lvl[lmt],par[lmt][20];
set<int>s[lmt],pre[lmt];

void dfs(int u,int p){
  for(int v:adj[u]){
    if(v==p) continue;
    lvl[v]=lvl[u]+1;
    par[v][0]=u;
    dfs(v,u);
  }
}

int lca(int p,int q){
  if(lvl[p]<lvl[q]) swap(p,q);
  for(int i=19;i>=0;i--){
    if(lvl[p]-(1<<i)>=lvl[q]){
      p=par[p][i];
    }
  }
  if(p==q) return p;
  for(int i=19;i>=0;i--){
    if(par[p][i]!=-1 && par[p][i]!=par[q][i]){
      p=par[p][i],q=par[q][i];
    }
  }
  return par[p][0];
}

int main(){
  fastio;

  for(int i=0;i<lmt;i++){
    for(int j=0;j<20;j++) par[i][j]=-1;
  }

  int n,m,k;
  cin>>n>>m>>k;
  for(int i=1;i<n;i++){
    int u,v;
    cin>>u>>v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  dfs(1,0);
  for(int j=1;j<20;j++){
    for(int i=1;i<=n;i++){
      if(par[i][j-1]==-1) continue;
      par[i][j]=par[par[i][j-1]][j-1];
    }
  }

  int a[m+1];
  for(int i=1;i<=m;i++){
    cin>>a[i];
    pre[a[i]].insert(i);
    if(i==1) continue;
    int p=lca(a[i-1],a[i]);
    s[p].insert(i-1);
  }

  while(k--){
    int t;
    cin>>t;
    if(t==1){
      int pos,v;
      cin>>pos>>v;
      pre[a[pos]].erase(pos);
      pre[v].insert(pos);
      if(pos>1) s[lca(a[pos-1],a[pos])].erase(pos-1);
      if(pos<m) s[lca(a[pos],a[pos+1])].erase(pos);
      a[pos]=v;
      if(pos>1) s[lca(a[pos-1],a[pos])].insert(pos-1);
      if(pos<m) s[lca(a[pos],a[pos+1])].insert(pos);
    }else{
      int l,r,v;
      cin>>l>>r>>v;
      auto it=s[v].lower_bound(l);
      if(it!=s[v].end() && (*it)+1<=r) cout<<(*it)<<" "<<(*it)+1<<endl;
      else{
        it=pre[v].lower_bound(l);
        if(it!=pre[v].end() && (*it)<=r) cout<<(*it)<<" "<<(*it)<<endl;
        else cout<<-1<<" "<<-1<<endl;
      }
    }
  }
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...