제출 #334661

#제출 시각아이디문제언어결과실행 시간메모리
334661KerimBirthday gift (IZhO18_treearray)C++17
100 / 100
2158 ms67012 KiB
#include "bits/stdc++.h" #define MAXN 200009 #define INF 1000000007 #define mp(x,y) make_pair(x,y) #define all(v) v.begin(),v.end() #define pb(x) push_back(x) #define wr cout<<"----------------"<<endl; #define ppb() pop_back() #define tr(ii,c) for(__typeof((c).begin()) ii=(c).begin();ii!=(c).end();ii++) #define ff first #define ss second #define my_little_dodge 46 #define debug(x) cerr<< #x <<" = "<< x<<endl; using namespace std; typedef long long ll; typedef pair<int,int> PII; template<class T>bool umin(T& a,T b){if(a>b){a=b;return 1;}return 0;} template<class T>bool umax(T& a,T b){if(a<b){a=b;return 1;}return 0;} vector<int>adj[MAXN]; const int LOGN=18; int P[MAXN][LOGN],lvl[MAXN],arr[MAXN]; set<PII>s,t; void dfs(int nd,int pr){ tr(it,adj[nd]){ if(*it==pr)continue; P[*it][0]=nd;lvl[*it]=lvl[nd]+1; dfs(*it,nd); } } int lca(int x,int y){ if(lvl[x]<lvl[y]) swap(x,y); for(int i=LOGN-1;i>=0;i--) if(lvl[P[x][i]]>=lvl[y]) x=P[x][i]; if(x==y)return x; for(int i=LOGN-1;i>=0;i--) if(P[x][i] and P[y][i]!=P[x][i]) x=P[x][i],y=P[y][i]; return P[x][0]; } int main(){ // freopen("file.in", "r", stdin); int n,m,q; scanf("%d%d%d",&n,&m,&q); for(int i=1;i<n;i++){ int u,v; scanf("%d%d",&u,&v); adj[u].pb(v); adj[v].pb(u); } dfs(1,-1); for(int i=1;i<=m;i++) scanf("%d",arr+i); for(int j=1;j<LOGN;j++) for(int i=1;i<=n;i++) if(P[i][j-1]) P[i][j]=P[P[i][j-1]][j-1]; t.insert(mp(arr[m],m)); for(int i=1;i<m;i++){ s.insert(mp(lca(arr[i],arr[i+1]),i)); t.insert(mp(arr[i],i)); } while(q--){ int tp; scanf("%d",&tp); if(tp==2){ int l,r,v; scanf("%d%d%d",&l,&r,&v); __typeof((t).begin())itt=t.lower_bound(mp(v,l)); if(itt!=t.end() and itt->ff==v and itt->ss<=r) printf("%d %d\n",itt->ss,itt->ss); else{ __typeof((s).begin())it=s.lower_bound(mp(v,l)); if(it!=s.end() and it->ff==v and it->ss<r) printf("%d %d\n",it->ss,(it->ss)+1); else puts("-1 -1"); } } else{ int p,v; scanf("%d%d",&p,&v); t.erase(mp(arr[p],p)); t.insert(mp(v,p)); if(p>1){ s.erase(mp(lca(arr[p-1],arr[p]),p-1)); s.insert(mp(lca(arr[p-1],v),p-1)); } if(p<m){ s.erase(mp(lca(arr[p+1],arr[p]),p)); s.insert(mp(lca(arr[p+1],v),p)); } arr[p]=v; } } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

treearray.cpp: In function 'int main()':
treearray.cpp:46:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   46 |     scanf("%d%d%d",&n,&m,&q);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~
treearray.cpp:49:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   49 |   scanf("%d%d",&u,&v);
      |   ~~~~~^~~~~~~~~~~~~~
treearray.cpp:55:11: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   55 |      scanf("%d",arr+i);
      |      ~~~~~^~~~~~~~~~~~
treearray.cpp:67:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   67 |   scanf("%d",&tp);
      |   ~~~~~^~~~~~~~~~
treearray.cpp:70:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   70 |    scanf("%d%d%d",&l,&r,&v);
      |    ~~~~~^~~~~~~~~~~~~~~~~~~
treearray.cpp:85:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   85 |    scanf("%d%d",&p,&v);
      |    ~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...