제출 #1332850

#제출 시각아이디문제언어결과실행 시간메모리
1332850WarinchaiBirthday gift (IZhO18_treearray)C++20
0 / 100
10 ms19364 KiB
#include<bits/stdc++.h>
using namespace std;

vector<int>adj[200005];
int ar[200005];
int lv[200005];
int pa[20][200005];
int in[200005],out[200005];
int cur=0;
int inf=1e9;
int n,m,q;

void dfs(int u,int p){
    lv[u]=lv[p]+1;
    pa[0][u]=p;
    in[u]=++cur;
    for(int i=1;i<20;i++)pa[i][u]=pa[i-1][pa[i-1][u]];
    for(auto x:adj[u])if(x!=p)dfs(x,u);
    out[u]=cur;
}

int lca(int a,int b){
    if(lv[a]<lv[b])swap(a,b);
    for(int i=19;i>=0;i--)if(lv[pa[i][a]]>=lv[b])a=pa[i][a];
    if(a==b)return a;
    for(int i=19;i>=0;i--)if(pa[i][a]!=pa[i][b])a=pa[i][a],b=pa[i][b];
    return pa[0][a];
}

set<int>pos1[200005],pos2[200005];

void add(int x){
    //cerr<<"x:"<<x<<" "<<ar[x]<<"\n";
    if(x>1)pos1[lca(ar[x],ar[x-1])].insert(x-1);
    if(x<m)pos1[lca(ar[x],ar[x+1])].insert(x);
    pos2[ar[x]].insert(x);
}

void del(int x){
    if(x>1)pos1[lca(ar[x],ar[x-1])].erase(x-1);
    if(x<m)pos1[lca(ar[x],ar[x+1])].erase(x);
    pos2[ar[x]].erase(x);
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m>>q;
    for(int i=0;i<n-1;i++){
        int a,b;cin>>a>>b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    dfs(1,0);
    for(int i=1;i<=m;i++)cin>>ar[i];
    for(int i=1;i<=m;i++)add(i);
    for(int i=0;i<q;i++){
        int t;cin>>t;
        if(t==1){
            int pos,v;cin>>pos>>v;
            del(pos);
            ar[pos]=v;
            add(pos);
        }else{
            int l,r,v;cin>>l>>r>>v;
            //cerr<<"QR"<<l<<' '<<r<<" "<<v<<"\n";
            auto it1=pos1[v].lower_bound(l),it2=pos2[v].lower_bound(l);
            //cerr<<(*it1)<<' '<<(*it2)<<"\n";
            if(it1!=pos1[v].end()&&(*it1)<=r)cout<<(*it1)<<' '<<(*it1)+1<<"\n";
            else if(it2!=pos2[v].end()&&(*it2)<=r)cout<<(*it2)<<' '<<(*it2)<<"\n";
            else cout<<"-1 -1\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...