Submission #999360

#TimeUsernameProblemLanguageResultExecution timeMemory
999360TAhmed33Inside information (BOI21_servers)C++98
50 / 100
173 ms113232 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 3e5 + 25; const int B = 18; int n, q; array <int, 4> queries[MAXN]; vector <pair <int, int>> adj[MAXN]; int p[MAXN], dp[B][MAXN], dep[MAXN], top[B][MAXN], inc[B][MAXN], decr[B][MAXN]; void dfs (int pos, int par) { p[pos] = par; for (auto [j, k] : adj[pos]) { if (j == par) continue; dep[j] = 1 + dep[pos]; dp[0][j] = pos; top[0][j] = k; inc[0][j] = 1; decr[0][j] = 1; for (int i = 1; i < B; i++) { dp[i][j] = dp[i - 1][dp[i - 1][j]]; top[i][j] = top[i - 1][dp[i - 1][j]]; inc[i][j] = inc[i - 1][j] && inc[i - 1][dp[i - 1][j]] && (top[i - 1][j] < top[0][dp[i - 1][j]]); decr[i][j] = decr[i - 1][j] && decr[i - 1][dp[i - 1][j]] && (top[i - 1][j] > top[0][dp[i - 1][j]]); } dfs(j, pos); } } int jump (int a, int b) { for (int i = B - 1; i >= 0; i--) { if (b & (1 << i)) { a = dp[i][a]; } } return a; } int lca (int a, int b) { if (dep[a] > dep[b]) swap(a, b); b = jump(b, dep[b] - dep[a]); if (a == b) return a; for (int i = B - 1; i >= 0; i--) { int x = dp[i][a], y = dp[i][b]; if (x && y && x != y) { a = x, b = y; } } return dp[0][a]; } pair <bool, int> check_inc (int a, int b, int x) { bool f = 1; int last = 0; for (int i = B - 1; i >= 0; i--) { int z = dp[i][a]; if (!z || dep[z] <= dep[b]) continue; f &= inc[i][a]; f &= top[0][a] > last; last = top[i][a]; a = z; } f &= top[0][a] <= x; f &= top[0][a] > last; return {f, top[0][a]}; } pair <bool, int> check_decr (int a, int b, int x) { bool f = top[0][a] <= x; int last = 1e9; for (int i = B - 1; i >= 0; i--) { int z = dp[i][a]; if (!z || dep[z] <= dep[b]) continue; f &= decr[i][a]; f &= top[0][a] < last; last = top[i][a]; a = z; } f &= top[0][a] < last; return {f, top[0][a]}; } bool check (int a, int b, int x) { if (a == b) return 1; int z = lca(a, b); if (z == a) return check_decr(b, z, x).first; if (z == b) return check_inc(a, z, x).first; auto g = check_inc(a, z, x), h = check_decr(b, z, x); return g.first && h.first && g.second < h.second; } void solve () { cin >> n >> q; int ee = 0; for (int i = 1; i <= n - 1 + q; i++) { char c; cin >> c; if (c == 'S') { int x, y; cin >> x >> y; adj[x].push_back({y, i}); adj[y].push_back({x, i}); } else if (c == 'Q') { int x, y; cin >> x >> y; queries[++ee] = {1, y, x, i}; } else { int x; cin >> x; queries[++ee] = {2, x, 0, i}; } } dfs(1, 0); for (int i = 1; i <= q; i++) { auto g = check(queries[i][1], queries[i][2], queries[i][3]); cout << (g ? "yes\n" : "no\n"); } } signed main () { ios::sync_with_stdio(0); cin.tie(0); int tc = 1; //cin >> tc; while (tc--) solve(); }

Compilation message (stderr)

servers.cpp: In function 'void dfs(int, int)':
servers.cpp:11:16: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   11 |      for (auto [j, k] : adj[pos]) {
      |                ^
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...