제출 #598238

#제출 시각아이디문제언어결과실행 시간메모리
598238penguinhacker동기화 (JOI13_synchronization)C++17
100 / 100
280 ms26888 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ar array

const int mxN=1e5;
int n, m, q, eu[mxN], ev[mxN], edge[mxN], last[mxN], ans[mxN], tin[mxN], tout[mxN], t, d[mxN], anc[mxN][17], ft[2*mxN+1];
vector<int> adj[mxN];
bool active[mxN];

void dfs(int u=0) {
	tin[u]=t++;
	for (int i=1; i<17; ++i)
		anc[u][i]=anc[anc[u][i-1]][i-1];
	for (int i : adj[u]) {
		int v=eu[i]^ev[i]^u;
		if (v!=anc[u][0]) {
			d[v]=d[u]+1, anc[v][0]=u;
			edge[i]=v;
			dfs(v);
		}
	}
	tout[u]=t++;
}

void upd(int i, int x) {
	for (++i; i<=2*n; i+=i&-i)
		ft[i]+=x;
}

int qry(int i) {
	int r=0;
	for (++i; i; i-=i&-i)
		r+=ft[i];
	return r;
}

int get_head(int u) {
	for (int i=16; ~i; --i)
		if (qry(tin[u])-qry(tin[anc[u][i]])==(1<<i))
			u=anc[u][i];
	return u;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> m >> q;
	for (int i=1; i<n; ++i) {
		cin >> eu[i] >> ev[i], --eu[i], --ev[i];
		adj[eu[i]].push_back(i);
		adj[ev[i]].push_back(i);
	}
	dfs();
	fill(ans, ans+n, 1);
	while(m--) {
		int u;
		cin >> u;
		u=edge[u];
		if (!active[u]) { // activate edge between u-p[u]
			int v=get_head(anc[u][0]);
			ans[v]+=ans[u]-last[u];
			//cout << v << " " << qry(tin[p[u]]) << endl;
		} else {
			ans[u]=ans[get_head(u)];
			last[u]=ans[u];
			//cout << get_head(u) << endl;
		}
		upd(tin[u], active[u]?-1:1);
		upd(tout[u], active[u]?1:-1);
		active[u]^=1;
	}
	while(q--) {
		int u;
		cin >> u, --u;
		cout << ans[get_head(u)] << "\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...