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...