Submission #113058

#TimeUsernameProblemLanguageResultExecution timeMemory
113058maruiiSynchronization (JOI13_synchronization)C++14
100 / 100
269 ms17912 KiB
#include <bits/stdc++.h> using namespace std; vector<int> edge[100001]; int dfn[100001], efn[100001], ifn[100001], dfnn; void dfs(int x, int p) { dfn[x] = ++dfnn; ifn[dfnn] = x; for (auto i: edge[x]) { if (i != p) dfs(i, x); } efn[x] = dfnn; } const int SIZE = 1 << 17; struct ST { int V[SIZE << 1]; void init(int nn, int s, int e) { if (s == e) { V[nn] = efn[ifn[s]]; return; } int m = s + e >> 1; init(nn << 1, s, m); init(nn << 1 | 1, m + 1, e); V[nn] = max(V[nn << 1], V[nn << 1 | 1]); } void update(int nn, int ns, int ne, int x, int v) { if (ns > x || ne < x) return; if (ns == ne) { V[nn] = v; return; } int m = ns + ne >> 1; update(nn << 1, ns, m, x, v); update(nn << 1 | 1, m + 1, ne, x, v); V[nn] = max(V[nn << 1], V[nn << 1 | 1]); } int query(int nn, int ns, int ne, int s, int e) { if (ns > s || V[nn] < e) return 0; if (ns == ne) return ifn[ns]; int m = ns + ne >> 1; int ret = query(nn << 1 | 1, m + 1, ne, s, e); if (ret) return ret; return query(nn << 1, ns, m, s, e); } } seg; int X[100002], Y[100002], T[100002], A[100002], B[100002]; int main(){ ios_base::sync_with_stdio(0), cin.tie(0); int N, M, Q; cin >> N >> M >> Q; for (int i = 1; i < N; ++i) { cin >> X[i] >> Y[i]; edge[X[i]].push_back(Y[i]); edge[Y[i]].push_back(X[i]); } dfs(1, 0); seg.init(1, 1, N); fill(A, A + N + 1, 1); for (int i = 0; i < M; ++i) { int j; cin >> j; auto &x = X[j], &y = Y[j]; if (dfn[x] < dfn[y]) swap(x, y); if (T[j]) { A[x] = B[x] = A[seg.query(1, 1, N, dfn[x], efn[x])]; seg.update(1, 1, N, dfn[x], efn[x]); } else { seg.update(1, 1, N, dfn[x], 0); A[seg.query(1, 1, N, dfn[x], efn[x])] += A[x] - B[x]; } T[j] ^= 1; } for (int i = 0; i < Q; ++i) { int x; cin >> x; cout << A[seg.query(1, 1, N, dfn[x], efn[x])] << '\n'; } return 0; }

Compilation message (stderr)

synchronization.cpp: In member function 'void ST::init(int, int, int)':
synchronization.cpp:25:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int m = s + e >> 1;
           ~~^~~
synchronization.cpp: In member function 'void ST::update(int, int, int, int, int)':
synchronization.cpp:37:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int m = ns + ne >> 1;
           ~~~^~~~
synchronization.cpp: In member function 'int ST::query(int, int, int, int, int)':
synchronization.cpp:46:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int m = ns + ne >> 1;
           ~~~^~~~
#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...