Submission #331762

#TimeUsernameProblemLanguageResultExecution timeMemory
331762HoneyBadgerSynchronization (JOI13_synchronization)C++17
100 / 100
401 ms33500 KiB
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <vector>
#include <bitset>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <deque>
#include <utility>
#include <algorithm>
#include <random>
#include <cmath>
#include <cassert>
#include <climits>
#include <ctime>
#include <chrono>


/*
#pragma GCC optimize("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,popcnt,abm,mmx,avx,avx2,tune=native")
*/


#ifdef LOCAL
    #define dbg(x) cout << #x << " : " << x << endl;
#else
    #define dbg(x)
#endif

#define int long long
#define pb push_back
#define ppb pop_back()
#define mp make_pair
#define fi(a, b) for (int i = a; i < b; i++)
#define fj(a, b) for (int j = a; j < b; j++)
#define fk(a, b) for (int k = a; k < b; k++)
#define fi1(a, b) for (int i = a - 1; i >= b; i--)
#define fj1(a, b) for (int j = a - 1; j >= b; j--)
#define fk1(a, b) for (int k = a - 1; k >= b; k--)
#define fx(x, a) for (auto& x : a)
#define rep(i, a, b) for (int i = a; i < b; ++i)
#define rep1(i, a, b) for (int i = a - 1; i >= b; --i)
#define siz(x) (int)x.size()
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()

using namespace std;

template<typename T1, typename T2>inline void mine(T1 &x, const T2 &y) { if (y < x) x = y; }
template<typename T1, typename T2>inline void maxe(T1 &x, const T2 &y) { if (x < y) x = y; }

ostream& operator << (ostream &out, const vector<int> &b) {
    for (auto k : b) out << k << ' ';
    return out;
}

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef char ch;
typedef string str;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<pii> vpii;
typedef vector<vpii> vvpii;
typedef vector<ch> vch;
typedef vector<vch> vvch;
typedef vector<str> vs;



const int MOD = 1000000007;
const int INF = 1000000050;
const long long BIG = (long long)2e18 + 50;
const int MX = 100500;
const double EPS = 1e-9;
const int PW = 17;

#warning setpw

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int BIT[MX];

int get(int i) {
	int ans = 0;
	for (; i > 0; i -= i&-i)
		ans += BIT[i];
	return ans;
}

void upd(int i, int x) {
	for (; i < MX; i += i&-i)
		BIT[i] += x;
}

void updlr(int l, int r, int x) {
	upd(l, x);
	upd(r, -x);
}

vi g[MX];
vpii edges;
int up[MX][PW];
int tin[MX], tout[MX], timer = 1;

void dfs(int v, int pr) {
	up[v][0] = pr;
	fi(1, PW) up[v][i] = up[up[v][i - 1]][i - 1];
	tin[v] = timer++;

	fx(to, g[v]) {
		if (to == pr) continue;
		dfs(to, v);
	}
	tout[v] = timer;
}

int sum(int v) {
	return get(tin[v]);
}

int getp(int v) {
	for (int i = PW - 1; i >= 0; --i) {
		//cout << v << ' ' << up[v][i] << ' ' << sum(v) << ' ' << sum(up[v][i]) << '\n';
		if (sum(v) - sum(up[v][i]) == (1 << i)) {
			v = up[v][i];
		}
	}
	return v;
}

int cnt[MX];
int delta[MX];


void delle(int v) {
	updlr(tin[v], tout[v], -1);
}

void adde(int v) {
	updlr(tin[v], tout[v], 1);
}

void del(int v) {
	//cout << "del : " << v << endl;
	int p = getp(v);
	//dbg(p);
	cnt[v] = cnt[p];
	delta[v] = 0;
	delle(v);
}

void add(int v) {
	adde(v);
	//cout << "add : " << v << endl;
	int p = getp(v);
	//dbg(p);
	delta[p] += delta[v];
	cnt[p] += delta[v];
	delta[v] = 0;
} 

int val[MX];

void flip(int i) {
	if (val[i] == 1)
		del(i);
	else
		add(i);
	val[i] ^= 1;
}

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int n, m, q;
    cin >> n >> m >> q;
    fi(1, n) {
    	int a, b;
    	cin >> a >> b;
    	--a, --b;
    	edges.pb({a, b});
    	g[a].pb(b);
    	g[b].pb(a);
    }
    fi(0, n) {
    	cnt[i] = delta[i] = 1;
    }
    dfs(0, 0);

    while (m--) {
    	int d;
    	cin >> d;
    	--d;
    	auto[a, b] = edges[d];
    	if (tin[a] < tin[b]) swap(a, b);
    	flip(a);
    	/*fi(0, n) {
    		cout << cnt[i] << ' ' << delta[i] << '\n';
    	}*/
    }

    while (q--) {
    	int v;
    	cin >> v;
    	--v;
    	cout << cnt[getp(v)] << '\n'; 
    }
}

Compilation message (stderr)

synchronization.cpp:88:2: warning: #warning setpw [-Wcpp]
   88 | #warning setpw
      |  ^~~~~~~
#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...