106622024-04-07 19:21:37111XORfa visszatércpp17Hibás válasz 0/100328ms165204 KiB
#include<bits/stdc++.h>
using namespace std;

#define int long long

struct Trie{
	vector<array<int,2>>t;
	vector<int>c;
	vector<set<int>>v;
	
	Trie():t(1),c(1),v(1){
	}
	
	void add(int n,int x){
		int y=0;
		for(int i=30;i>=0;i--){
			int b=x>>i&1;
			if(t[y][b]==0){
				t[y][b]=t.size();
				t.emplace_back();
				c.emplace_back();
				v.emplace_back();
			}
			y=t[y][b];
			c[y]++;
		}
		v[y].insert(n);
	}
	
	void rem(int n,int x){
		int y=0;
		for(int i=30;i>=0;i--){
			int b=x>>i&1;
			y=t[y][b];
			c[y]--;
		}
		v[y].erase(n);
	}
	
	int get(int x){
		int y=0;
		for(int i=30;i>=0;i--){
			int b=x>>i&1;
			if(c[t[y][b^1]]){
				y=t[y][b^1];
			}
			else{
				y=t[y][b];
			}
		}
		return *v[y].begin();
	}
};

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int N,Q;
	cin>>N>>Q;
	vector<vector<pair<int,int>>>g(N+1);
	for(int i=0;i<N-1;i++){
		int a,b,w;
		cin>>a>>b>>w;
		g[a].emplace_back(b,w);
		g[b].emplace_back(a,w);
	}
	vector<int>v(N+1);
	auto dfs=[&](auto self,int i,int p,int x)->void{
		v[i]=x;
		for(auto[j,w]:g[i]){
			if(j==p){
				continue;
			}
			self(self,j,i,x^w);
		}
	};
	dfs(dfs,1,0,0);
	set<int>s;
	Trie t;
	vector<set<int>>p(N+1);
	multimap<int,pair<int,int>>ans;
	ans.emplace(0,pair<int,int>{0,0});
	while(Q--){
		int x;
		cin>>x;
		if(s.count(x)){
			s.erase(x);
			t.rem(x,v[x]);
			for(int y:p[x]){
				p[y].erase(x);
			}
			p[x].clear();
		}
		else{
			if(!s.empty()){
				int y=t.get(v[x]);
				if(!p[x].count(y)){
					ans.emplace(v[x]^v[y],pair<int,int>{x,y});
					p[x].insert(y);
					p[y].insert(x);
				}
			}
			s.insert(x);
			t.add(x,v[x]);
		}
		// while((--ans.end())->first!=0&&(!s.count((--ans.end())->second.first)||!s.count((--ans.end())->second.second))){
			// auto[x,y]=(--ans.end())->second;
			// ans.erase(--ans.end());
			// if(s.size()>1){
				// if(s.count(x)){
					// int z=t.get(v[x]);
					// if(!p[x].count(z)){
						// ans.emplace(v[x]^v[z],pair<int,int>{x,z});
						// p[x].insert(z);
						// p[z].insert(x);
					// }
				// }
				// if(s.count(y)){
					// int z=t.get(v[y]);
					// if(!p[y].count(z)){
						// ans.emplace(v[y]^v[z],pair<int,int>{y,z});
						// p[y].insert(z);
						// p[z].insert(y);
					// }
				// }
			// }
		// }
		// for(auto[i,_]:ans)cout<<i<<' ';cout<<endl;
		cout<<(--ans.end())->first<<'\n';
	}
	return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Hibás válasz3ms1896 KiB
2Elfogadva3ms2088 KiB
subtask20/11
3Hibás válasz3ms2588 KiB
4Hibás válasz3ms2552 KiB
5Hibás válasz3ms2864 KiB
6Hibás válasz3ms3028 KiB
7Hibás válasz3ms2992 KiB
8Hibás válasz3ms3240 KiB
9Hibás válasz3ms3500 KiB
10Hibás válasz3ms3424 KiB
11Hibás válasz3ms3380 KiB
12Hibás válasz3ms3692 KiB
13Hibás válasz3ms3904 KiB
subtask30/13
14Hibás válasz65ms18916 KiB
15Hibás válasz64ms19348 KiB
16Hibás válasz112ms24224 KiB
17Elfogadva136ms32276 KiB
18Elfogadva140ms37380 KiB
19Elfogadva152ms39460 KiB
20Hibás válasz126ms28680 KiB
21Hibás válasz129ms32000 KiB
22Hibás válasz64ms20192 KiB
23Hibás válasz67ms20260 KiB
subtask40/17
24Hibás válasz6ms7448 KiB
25Hibás válasz6ms7564 KiB
26Hibás válasz6ms7628 KiB
27Hibás válasz7ms9584 KiB
28Elfogadva7ms9664 KiB
29Hibás válasz4ms7516 KiB
30Hibás válasz6ms7504 KiB
31Hibás válasz4ms7568 KiB
32Hibás válasz4ms5836 KiB
33Hibás válasz4ms5832 KiB
34Hibás válasz4ms5784 KiB
35Hibás válasz4ms5876 KiB
subtask50/59
36Hibás válasz206ms97244 KiB
37Hibás válasz206ms87868 KiB
38Hibás válasz317ms163276 KiB
39Hibás válasz328ms164676 KiB
40Hibás válasz300ms165204 KiB
41Hibás válasz204ms96348 KiB
42Hibás válasz243ms96760 KiB
43Hibás válasz207ms96332 KiB
44Hibás válasz239ms96400 KiB
45Hibás válasz170ms87824 KiB
46Hibás válasz153ms41420 KiB
47Hibás válasz172ms41380 KiB
48Hibás válasz152ms41364 KiB
49Hibás válasz156ms41588 KiB