제출 #874410

#제출 시각아이디문제언어결과실행 시간메모리
874410sleepntsheepGrowing Trees (BOI11_grow)C++17
0 / 100
1059 ms5968 KiB
#include <stdio.h> #define INLINE inline __attribute__((always_inline)) #define assert_(x) if (!(x)) __builtin_trap() #define N 200001 unsigned seed = 0x8321798; INLINE unsigned rand_(void) { return seed = ((seed << 3) ^ 86868686); } int A[N], B[N], S[N], L[N], R[N], D[N], AT; INLINE int treap(int x) { A[++AT] = x; B[AT] = rand_(); S[AT] = 1; return AT; } INLINE void pull(int v) { S[v] = 1 + S[L[v]] + S[R[v]]; } INLINE void push(int v) { if (D[v]) { A[v] += D[v]; if (L[v]) { D[L[v]] += D[v]; D[R[v]] += D[v]; } D[v] = 0; } } void split(int v, int *l, int *r, int val) { if (!v) { *l=*r=0; return; } push(v); if (A[v] <= val) { split(R[v], R+v, r, val); *l = v; } else { split(L[v], l, L+v, val); *r = v; } pull(v); } void spliti(int v, int *l, int *r, int ind) { if (!v) { *l=*r=0; return; } push(v); if (S[L[v]] < ind) { split(R[v], R+v, r, ind - S[L[v]] - 1); *l = v; } else { split(L[v], l, L+v, ind); *r = v; } pull(v); } void merge(int *v, int l, int r) { if (!l || !r) { *v = l^r; return; } push(l), push(r); if (B[l] < B[r]) { merge(L+r, l, L[r]); *v = r; } else { merge(R+l, R[l], r); *v = l; } pull(*v); } void join(int *v, int l, int r) { if (!l || !r) { *v = l^r; return; } if (B[l] < B[r]) { int T = l; l = r; r = T; } push(l), push(r); int y1, y2; split(l, &y1, &y2, A[r]); join(R+r, R[r], y2); join(L+r, L[r], y1); *v = r; pull(*v); } int order(int v, int k) { if (!v) return 0; if (A[v] < k) return 1 + S[L[v]] + order(R[v], k); return order(L[v], k); } int n, q, t; char op; void print(int v) { if (!v) return; print(L[v]); printf("%d ", A[v]); print(R[v]); } INLINE void fertilize(int s, int h) { int j = order(t, h); int y1 = 0, y2 = 0, y3 = 0, y4 = 0; spliti(t, &y1, &y2, j); spliti(y2, &y3, &y4, s); ++D[y3]; push(y3); join(&y2, y3, y4); merge(&t, y1, y2); } INLINE void query(int x, int y) { printf("%d\n", order(t, y+1) - order(t, x)); } int main(void) { scanf("%d%d", &n, &q); for (int x, i = 0; i < n; ++i) scanf("%d", &x), join(&t, t, treap(x)); for (int x, y, i = 0; i < q; ++i) { scanf(" %c%d%d", &op, &x, &y); if (op == 'F') fertilize(x, y); else query(x, y); } return 0; }

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

grow.cpp: In function 'int main()':
grow.cpp:153:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  153 |     scanf("%d%d", &n, &q);
      |     ~~~~~^~~~~~~~~~~~~~~~
grow.cpp:154:41: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  154 |     for (int x, i = 0; i < n; ++i) scanf("%d", &x), join(&t, t, treap(x));
      |                                    ~~~~~^~~~~~~~~~
grow.cpp:158:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  158 |         scanf(" %c%d%d", &op, &x, &y);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...