106662024-04-07 19:33:57111XORfa visszatércpp17Hibás válasz 0/1001.564s165576 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<int>h(N+1);
	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();
			h[x]=0;
		}
		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);
					h[x]=max(h[x],v[x]^v[y]);
					h[y]=max(h[y],v[x]^v[y]);
				}
			}
			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]);
					int o=v[x]^v[z];
					if(!p[x].count(z)&&o>h[z]){
						ans.emplace(o,pair<int,int>{x,z});
						p[x].insert(z);
						p[z].insert(x);
					}
				}
				if(s.count(y)){
					int z=t.get(v[y]);
					int o=v[y]^v[z];
					if(!p[y].count(z)&&o>h[z]){
						ans.emplace(o,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
1Elfogadva3ms1904 KiB
2Elfogadva3ms2096 KiB
subtask20/11
3Elfogadva3ms2716 KiB
4Elfogadva3ms2928 KiB
5Elfogadva3ms3184 KiB
6Elfogadva3ms3396 KiB
7Hibás válasz3ms3628 KiB
8Elfogadva3ms3532 KiB
9Hibás válasz3ms3520 KiB
10Hibás válasz3ms3296 KiB
11Hibás válasz3ms3580 KiB
12Hibás válasz3ms3796 KiB
13Hibás válasz3ms4004 KiB
subtask30/13
14Hibás válasz65ms17948 KiB
15Hibás válasz71ms17940 KiB
16Elfogadva119ms24900 KiB
17Elfogadva148ms32780 KiB
18Elfogadva152ms38124 KiB
19Elfogadva156ms39944 KiB
20Elfogadva130ms29536 KiB
21Elfogadva141ms32344 KiB
22Hibás válasz70ms18572 KiB
23Hibás válasz68ms18576 KiB
subtask40/17
24Elfogadva4ms7064 KiB
25Hibás válasz4ms7028 KiB
26Elfogadva4ms7024 KiB
27Elfogadva7ms9104 KiB
28Elfogadva7ms9096 KiB
29Hibás válasz4ms6944 KiB
30Elfogadva4ms7088 KiB
31Elfogadva4ms7112 KiB
32Hibás válasz23ms5372 KiB
33Hibás válasz24ms5472 KiB
34Hibás válasz23ms5572 KiB
35Hibás válasz23ms5376 KiB
subtask50/59
36Elfogadva212ms97524 KiB
37Hibás válasz211ms88056 KiB
38Elfogadva270ms163696 KiB
39Elfogadva294ms165040 KiB
40Elfogadva310ms165576 KiB
41Elfogadva211ms96588 KiB
42Elfogadva246ms97108 KiB
43Hibás válasz215ms96652 KiB
44Elfogadva210ms96964 KiB
45Hibás válasz145ms88324 KiB
46Időlimit túllépés1.564s22904 KiB
47Időlimit túllépés1.562s22780 KiB
48Időlimit túllépés1.552s22948 KiB
49Időlimit túllépés1.531s22832 KiB