Submission #319122

#TimeUsernameProblemLanguageResultExecution timeMemory
319122FischerBirthday gift (IZhO18_treearray)C++14
100 / 100
1529 ms82788 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 2e5 + 10; vector<int> g[maxn]; using pii = pair<int, int>; int n, m, q; int a[maxn]; int st[maxn][18]; int h[maxn]; set<int> cnt[2][maxn]; int T = 0; void dfs(int x, int p) { h[x] = h[p] + 1; st[x][0] = p; for (int k = 1; k < 18; ++k) { st[x][k] = st[st[x][k-1]][k-1]; } for (int v : g[x]) { if (v == p) continue; dfs(v, x); } } int lca(int x, int y) { if (h[x] > h[y]) swap(x, y); for (int k = 17; k >= 0; --k) { if (h[st[y][k]] >= h[x]) { y = st[y][k]; } } if (x == y) return x; for (int k = 17; k >= 0; --k) { if (st[x][k] != st[y][k]) { x = st[x][k]; y = st[y][k]; } } return st[x][0]; } int main() { scanf("%d%d%d", &n, &m, &q); for (int i = 0; i < n-1; ++i) { int u, v; scanf("%d%d", &u, &v); g[u].push_back(v); g[v].push_back(u); } dfs(1, 0); for (int i = 1; i <= m; ++i) { scanf("%d", a+i); } for (int i = 1; i <= m; ++i) { cnt[0][a[i]].insert(i); if (i < m) { cnt[1][lca(a[i], a[i+1])].insert(i); } } while (q--) { int type; scanf("%d", &type); if (type == 1) { int pos, v; scanf("%d%d", &pos, &v); if (pos < m) { cnt[1][lca(a[pos], a[pos+1])].erase(pos); } if (pos > 1) { cnt[1][lca(a[pos-1], a[pos])].erase(pos-1); } cnt[0][a[pos]].erase(pos); a[pos] = v; cnt[0][a[pos]].insert(pos); if (pos < m) { cnt[1][lca(a[pos], a[pos+1])].insert(pos); } if (pos > 1) { cnt[1][lca(a[pos-1], a[pos])].insert(pos-1); } } else { int l, r, v; scanf("%d%d%d", &l, &r, &v); bool ok = 0; auto q = cnt[0][v].lower_bound(l); if (q != cnt[0][v].end() && *q <= r) { printf("%d %d\n", *q, *q); continue; } auto u = cnt[1][v].lower_bound(l); if (u != cnt[1][v].end() && *u < r) { printf("%d %d\n", *u, *u + 1); } else { puts("-1 -1"); } } } return 0; }

Compilation message (stderr)

treearray.cpp: In function 'int main()':
treearray.cpp:85:18: warning: unused variable 'ok' [-Wunused-variable]
   85 |             bool ok = 0;
      |                  ^~
treearray.cpp:44:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   44 |     scanf("%d%d%d", &n, &m, &q);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~
treearray.cpp:47:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   47 |         scanf("%d%d", &u, &v);
      |         ~~~~~^~~~~~~~~~~~~~~~
treearray.cpp:53:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   53 |         scanf("%d", a+i);
      |         ~~~~~^~~~~~~~~~~
treearray.cpp:63:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   63 |         scanf("%d", &type);
      |         ~~~~~^~~~~~~~~~~~~
treearray.cpp:66:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   66 |             scanf("%d%d", &pos, &v);
      |             ~~~~~^~~~~~~~~~~~~~~~~~
treearray.cpp:84:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   84 |             scanf("%d%d%d", &l, &r, &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...