Submission #659557

#TimeUsernameProblemLanguageResultExecution timeMemory
659557NekoRollyTraffickers (RMI18_traffickers)C++17
15 / 100
193 ms70172 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 3e4+4; const int N1 = 5e4+4; struct Bit{ int n,t[N1]; void up(int i,int val){ for (; i<=n; i+=i&-i) t[i] += val; } int que(int l,int r){ int ans = 0; for (; r>0; r-=r&-r) ans += t[r]; for (l--; l>0; l-=l&-l) ans -= t[l]; return ans; } } d[20][21]; struct Update{ int t0,r,i,val; }; struct Query{ int T,i,id,val; }; int n,n1,n2,k,q; vector<int> adj[N]; int L[N],R[N],up[N][15]; vector<Update> Qs_U[N]; vector<Query> Qs_Q[N]; ll ans[N1]; void dfs1(int u,int p){ L[u] = n1++, up[u][0] = p; for (int i=1; i<15; i++) up[u][i] = up[up[u][i-1]][i-1]; for (int v : adj[u]) if (v != p) dfs1(v, u); R[u] = n1; } bool isa(int a,int b){ return L[a] <= L[b] && R[b] <= R[a]; } int lca(int a,int b){ if (isa(a, b)) return a; if (isa(b, a)) return b; for (int i=14; i>=0; i--) if (!isa(up[a][i], b)) a = up[a][i]; return up[a][0]; } void add(int a,int b,int id,int val){ vector<int> aux,v; int l = lca(a, b); for (; ; a=up[a][0]){ v.push_back(a); if (a == l) break; } for (; b!=l; b=up[b][0]) aux.push_back(b); reverse(aux.begin(), aux.end()); for (int x : aux) v.push_back(x); for (int i=0; i<v.size(); i++) Qs_U[v[i]].push_back({i, int(v.size()), id, val}); } void dfs2(int u,int p){ for (auto [t0, r, i, val] : Qs_U[u]) d[t0][r].up(i, val); for (auto [T, i, id, val] : Qs_Q[u]) for (int t0=0; t0<=T; t0++) for (int r=1; r<=20; r++) ans[id] += 1ll*val*d[t0][r].que(1, i)*((T-t0)/r + 1); for (int v : adj[u]) if (v != p) dfs2(v, u); for (auto [t0, r, i, val] : Qs_U[u]) d[t0][r].up(i, -val); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for (int i=1,a,b; i<n; i++){ cin >> a >> b; adj[a].push_back(b), adj[b].push_back(a); } dfs1(1, 1); cin >> k; for (int a,b; k--; ){ cin >> a >> b; add(a, b, 1, 1);} cin >> q; q++; for (int t,a,b,t1,t2,i=2; i<=q; i++){ cin >> t >> a >> b; if (t == 3){ cin >> t1 >> t2; int l = lca(a, b); if (t1){ Qs_Q[a].push_back({t1-1, i, n2, -1}); Qs_Q[b].push_back({t1-1, i, n2, -1}); Qs_Q[l].push_back({t1-1, i, n2, 1}); if (l != 1) Qs_Q[up[l][0]].push_back({t1-1, i, n2, 1}); } Qs_Q[a].push_back({t2, i, n2, 1}); Qs_Q[b].push_back({t2, i, n2, 1}); Qs_Q[l].push_back({t2, i, n2, -1}); if (l != 1) Qs_Q[up[l][0]].push_back({t2, i, n2, -1}); n2++; } else add(a, b, i, t==1 ? 1 : -1); } for (int t0=0; t0<20; t0++) for (int r=1; r<=20; r++) d[t0][r].n = q; dfs2(1, -1); for (int i=0; i<n2; i++) cout << ans[i] << "\n"; return 0; }

Compilation message (stderr)

traffickers.cpp: In function 'void add(int, int, int, int)':
traffickers.cpp:63:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |  for (int i=0; i<v.size(); i++)
      |                ~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...