Submission #173109

#TimeUsernameProblemLanguageResultExecution timeMemory
173109juggernautBirthday gift (IZhO18_treearray)C++14
100 / 100
1350 ms74736 KiB
//Just try and the idea will come!
#include<bits/stdc++.h>
using namespace std;
int n,m,q,i,x,y,z,timer,tin[200001],tout[200001],up[200001][19],l,r,a[200001];
vector<int>g[200001];
set<pair<int,int>>st[200001];
void dfs(int v,int p){
    up[v][0]=p;
    tin[v]=timer++;
    for(int i=1;i<19;i++)up[v][i]=up[up[v][i-1]][i-1];
    for(int to:g[v])if(to!=p)dfs(to,v);
    tout[v]=timer++;
}
bool upper(int a,int b){
    return tin[a]<=tin[b]&&tout[a]>=tout[b];
}
int lca(int a,int b){
    if(upper(a,b))return a;
    if(upper(b,a))return b;
    for(int i=18;i>=0;i--)if(!upper(up[a][i],b))a=up[a][i];
    return up[a][0];
}
int main(){
    scanf("%d%d%d",&n,&m,&q);
    for(i=1;i<n;i++){
        scanf("%d%d",&x,&y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    dfs(1,1);
    scanf("%d",&x);
    a[1]=x;
    st[x].insert({1,1});
    for(i=2;i<=m;i++){
        scanf("%d",&y);
        a[i]=y;
        st[y].insert({i,i});
        st[lca(y,x)].insert({i-1,i});
        x=y;
    }
    while(q--){
        scanf("%d",&x);
        if(x&1){
            scanf("%d%d",&x,&y);
            st[a[x]].erase({x,x});
            if(x>1)st[lca(a[x-1],a[x])].erase({x-1,x});
            if(x<m)st[lca(a[x],a[x+1])].erase({x,x+1});
            a[x]=y;
            st[a[x]].insert({x,x});
            if(x>1)st[lca(a[x-1],a[x])].insert({x-1,x});
            if(x<m)st[lca(a[x],a[x+1])].insert({x,x+1});
        }else{
            scanf("%d%d%d",&x,&y,&z);
            auto it=st[z].lower_bound({x,0});l=r=-1;
            if(it!=st[z].end()&&it->second<=y){
                l=it->first;
                r=it->second;
            }
            printf("%d %d\n",l,r);
        }
    }
}

Compilation message (stderr)

treearray.cpp: In function 'int main()':
treearray.cpp:24:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%d",&n,&m,&q);
     ~~~~~^~~~~~~~~~~~~~~~~~~
treearray.cpp:26:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d",&x,&y);
         ~~~~~^~~~~~~~~~~~~~
treearray.cpp:31:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&x);
     ~~~~~^~~~~~~~~
treearray.cpp:35:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d",&y);
         ~~~~~^~~~~~~~~
treearray.cpp:42:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d",&x);
         ~~~~~^~~~~~~~~
treearray.cpp:44:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d%d",&x,&y);
             ~~~~~^~~~~~~~~~~~~~
treearray.cpp:53:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d%d%d",&x,&y,&z);
             ~~~~~^~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...