Submission #1273142

#TimeUsernameProblemLanguageResultExecution timeMemory
1273142repmannSynchronization (JOI13_synchronization)C++20
20 / 100
155 ms29468 KiB
#include <bits/stdc++.h>
using namespace std;
int N, M, K, Q;
struct Edge
{
  int u, v, sz;
  bool p;
}E[100000];
int A[200001];
struct Node
{
  int p, r, sz;
}DSU[100001];
struct Delta
{
  int i, p, r;
}D[200001];
int d;
vector <int> ST[800001];
inline void Insert(int L, int R, int X, int i = 1, int LC = 1, int RC = K)
{
  if((L > RC) || (LC > R)) return;
  if((L <= LC) && (RC <= R)) {ST[i].push_back(X); return;}
  int S = (LC + RC) >> 1;
  Insert(L, R, X, i << 1, LC, S);
  Insert(L, R, X, i << 1 | 1, S + 1, RC);
  return;
}
inline int Find(int u)
{
  while(u != DSU[u].p) u = DSU[u].p;
  return u;
}
inline void Union(int u, int v)
{
  u = Find(u);
  v = Find(v);
  if(u == v) exit(333);
  if(DSU[u].r < DSU[v].r) swap(u, v);
  if(DSU[u].r == DSU[v].r)
  {
    D[++d] = {u, u, DSU[u].r};
    DSU[u].r++;
  }
  DSU[v].p = u;
  D[++d] = {v, v, DSU[v].r};
  return;
}
inline void Rollback(int cp)
{
  while(d > cp)
  {
    DSU[D[d].i].sz = DSU[DSU[D[d].i].p].sz;
    DSU[D[d].i].p = D[d].p;
    DSU[D[d].i].r = D[d].r;
    d--;
  }
  return;
}
int sz = 2, e;
inline void DFS(int i = 1)
{
  int cp = d;
  for(int x : ST[i]) Union(E[x].u, E[x].v);
  if(i >= K)
  {
    e++;
    E[A[e]].p ^= 1;
//    cout << e << ' ' << sz << '\n';
    if(E[A[e]].p)
    {
      DSU[Find(E[A[e]].u)].sz = sz - E[A[e]].sz; ///das odgovarajuci sajz komponenti
//      cout << "bruh1: " << Find(E[A[e]].u) << '\n';
    }
    else
    {
      DSU[Find(E[A[e]].u)].sz = DSU[Find(E[A[e]].v)].sz = sz; ///u obe komponente upises prethodni ukupni sajz
//      cout << "bruh2: " << Find(E[A[e]].u) << ' ' << Find(E[A[e]].v) << '\n';
    }
    if(i == (K + M - 1)) return;
    if(E[A[e + 1]].p) sz = E[A[e + 1]].sz = DSU[Find(E[A[e + 1]].u)].sz; ///upisi ukupni sajz u sz i u E[A[e]].sz jer ce se razdvojiti
    else sz = DSU[Find(E[A[e + 1]].u)].sz + DSU[Find(E[A[e + 1]].v)].sz; ///saberi sajzove u sz jer ce se spojiti
  }
  else
  {
    DFS(i << 1);
    DFS(i << 1 | 1);
  }
  Rollback(cp);
  return;
}
int main()
{
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> N >> M >> Q;
  for(int i = 1; i < N; i++) cin >> E[i].u >> E[i].v;
  for(int i = 1; i <= M; i++) cin >> A[i];
  K = 1;
  while(K < M) K <<= 1;
  for(int i = 1; i <= M; i++)
  {
    E[A[i]].p ^= 1;
    if(!E[A[i]].p) {Insert(E[A[i]].sz, i - 1, A[i]); E[A[i]].sz = 0;}
    else E[A[i]].sz = i;
  }
  for(int i = 1; i < N; i++) if(E[i].p) {Insert(E[i].sz, M, i); E[i].p = E[i].sz = 0;}
  for(int i = 1; i <= N; i++) DSU[i] = {i, 0, 1};
//  cout << "krecemo\n";
  DFS();
  int u;
  while(Q--)
  {
    cin >> u;
    cout << DSU[Find(u)].sz << '\n';
  }

  return 0;
}
#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...