제출 #107253

#제출 시각아이디문제언어결과실행 시간메모리
107253wilwxkBall Machine (BOI13_ballmachine)C++11
0 / 100
1094 ms19320 KiB
#include <bits/stdc++.h> using namespace std; struct node { int mn, mni, cnt; }; const int MAXN=1e5+5; vector<int> g[MAXN], ord; set<int> s; node seg[MAXN*4]; int indt[MAXN], prof[MAXN]; int v[MAXN]; int n, q; void dfs(int cur, int p) { for(auto viz : g[cur]) { if(viz==p) continue; prof[viz]=prof[cur]+1; dfs(viz, cur); } ord.push_back(cur); indt[cur]=ord.size()-1; } // int query(int sind, int ini, int fim, int qini, int qfim) { // if(qini>fim||qfim<ini) return 0; // if(qini<=ini&&qfim>=fim) return seg[sind].mni; // int m=(ini+fim)/2; int e=sind*2; int d=e+1; // int aa=query(e, ini, m, qini, qfim); // int bb=query(d, m+1, fim, qini, qfim); // if(prof[ord[aa]]<=prof[ord[bb]]) return aa; // else return bb; // } // void update(int sind, int ini, int fim, int qind, int k) { // if(qind<ini||qind>fim) return; // if(ini==fim) { // if(k==1) seg[sind].mn=prof[ord[ini]], seg[sind].cnt=0; // else seg[sind].mn=MAXN, seg[sind].cnt=1; // return; // } // int m=(ini+fim)/2; int e=sind*2; int d=e+1; // update(e, ini, m, qind, k); update(d, m+1, fim, qind, k); // seg[sind].mn=min(seg[e].mn, seg[d].mn); // if(seg[sind].mn==seg[e].mn) seg[sind].mni=seg[e].mni; // else seg[sind].mni=seg[d].mni; // seg[sind].cnt=seg[e].cnt+seg[d].cnt; // } int query(int sind, int ini, int fim, int qini, int qfim) { int resp=qini; for(int i=qini; i<=qfim; i++) if(prof[ord[v[i]]]<prof[ord[v[resp]]]) resp=i; return resp; } void update(int sind, int ini, int fim, int qind, int k) { if(k==1) v[qind]=qind; else v[qind]=0; } void build(int sind, int ini, int fim) { if(ini==fim) { seg[sind].mn=MAXN; seg[sind].mni=ini; seg[sind].cnt=1; return; } int m=(ini+fim)/2; int e=sind*2; int d=e+1; build(e, ini, m); build(d, m+1, fim); seg[sind].mn=MAXN; seg[sind].mni=0; seg[sind].cnt=seg[e].cnt+seg[d].cnt; } int main() { scanf("%d %d", &n, &q); for(int i=1; i<=n; i++) { int a; scanf("%d", &a); if(a==0) continue; g[a].push_back(i); g[i].push_back(a); } for(int i=1; i<=n; i++) sort(g[i].begin(), g[i].end()); ord.push_back(0); prof[1]=1; dfs(1, 1); prof[0]=MAXN; for(int i=1; i<=n; i++) s.insert(i); build(1, 1, n); while(q--) { int a, val; scanf("%d %d", &a, &val); if(a==1) { int ind; for(int i=1; i<=val; i++) { ind=*s.begin(); update(1, 1, n, ind, 1); s.erase(s.begin()); // printf("%d > %d // %d\n", i, ind, ord[query(1, 1, n, 1, n)]); } printf("%d\n", ord[ind]); } else { int cara=query(1, 1, n, indt[val], n); printf("%d\n", prof[val]-prof[ord[cara]]); update(1, 1, n, cara, -1); s.insert(cara); // printf("qu %d %d > %d\n", indt[val], n, ord[cara]); } } }

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

ballmachine.cpp: In function 'int main()':
ballmachine.cpp:77:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &n, &q);
  ~~~~~^~~~~~~~~~~~~~~~~
ballmachine.cpp:79:15: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   int a; scanf("%d", &a);
          ~~~~~^~~~~~~~~~
ballmachine.cpp:91:20: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   int a, val; scanf("%d %d", &a, &val);
               ~~~~~^~~~~~~~~~~~~~~~~~~
ballmachine.cpp:100:26: warning: 'ind' may be used uninitialized in this function [-Wmaybe-uninitialized]
    printf("%d\n", ord[ind]);
                          ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...