106592024-04-07 19:12:57111XORfa visszatércpp17Futási hiba 28/1001.57s164308 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
1Elfogadva3ms1900 KiB
2Elfogadva3ms2096 KiB
subtask211/11
3Elfogadva3ms2456 KiB
4Elfogadva3ms2708 KiB
5Elfogadva3ms2716 KiB
6Elfogadva3ms2932 KiB
7Elfogadva3ms2948 KiB
8Elfogadva3ms2892 KiB
9Elfogadva3ms3144 KiB
10Elfogadva3ms2852 KiB
11Elfogadva3ms2856 KiB
12Elfogadva3ms3108 KiB
13Elfogadva3ms3060 KiB
subtask30/13
14Futási hiba30ms16248 KiB
15Futási hiba29ms16544 KiB
16Futási hiba29ms16548 KiB
17Elfogadva148ms31588 KiB
18Elfogadva153ms36772 KiB
19Elfogadva173ms38768 KiB
20Elfogadva141ms27732 KiB
21Futási hiba29ms16864 KiB
22Futási hiba29ms16696 KiB
23Futási hiba29ms16968 KiB
subtask417/17
24Elfogadva6ms6496 KiB
25Elfogadva4ms6496 KiB
26Elfogadva6ms6880 KiB
27Elfogadva7ms8900 KiB
28Elfogadva7ms8908 KiB
29Elfogadva4ms6760 KiB
30Elfogadva6ms6988 KiB
31Elfogadva4ms7088 KiB
32Elfogadva24ms5324 KiB
33Elfogadva24ms5368 KiB
34Elfogadva24ms5264 KiB
35Elfogadva24ms5260 KiB
subtask50/59
36Elfogadva212ms96476 KiB
37Elfogadva182ms86928 KiB
38Elfogadva270ms162604 KiB
39Elfogadva360ms163696 KiB
40Elfogadva307ms164308 KiB
41Elfogadva209ms95520 KiB
42Elfogadva210ms96028 KiB
43Elfogadva211ms95516 KiB
44Elfogadva241ms95460 KiB
45Elfogadva146ms86920 KiB
46Időlimit túllépés1.565s21860 KiB
47Időlimit túllépés1.559s21796 KiB
48Időlimit túllépés1.567s21752 KiB
49Időlimit túllépés1.57s21712 KiB