第1,3,4,5个点RE
#include <bits/stdc++.h>
#define bt bitset<1010>
#define lc k<<1
#define rc k<<1|1
using namespace std;
const int N=510;
const int Q=1010;
bt dis[N];
struct xxj{
bt p[1010];
void ins(bt val)
{
for(int i=999;i>=0;i--)
if(val[i])
{
if(!p[i].count()) p[i]=val;
val^=p[i];
if(!val.count()) return;
}
}
bt qry()
{
bt val=0;
for(int i=999;i>=0;i--)
if(!val[i]) val^=p[i];
return val;
}
}glb;
int h[N],e_num=1,vis[N];
struct Edge{
int nxt,to;bt dis;
Edge(int a=0,int b=0,bt c=0){ nxt=a,to=b,dis=c; }
}qe[Q<<1],e[Q<<1];
void add(int from,int to,bt dis)
{
e[++e_num]=(Edge){h[from],to,dis};
h[from]=e_num;
}
void dfs(int u,int pre,bt wi)
{
vis[u]=1,dis[u]=wi;
for(int i=h[u];i;i=e[i].nxt)
{
if((i^pre)==1) continue;
int v=e[i].to;
if(vis[v]) glb.ins(dis[u]^dis[v]^e[i].dis);
else dfs(v,i,wi^e[i].dis);
}
}
int l[Q<<1],r[Q<<1],id[Q];
vector<Edge>op[6060];
void modify(int k,int l,int r,int x,int y,Edge ei)
{
if(l>=x&&r<=y)
{
op[k].push_back(ei);
return;
}
if(l>y||r<x) return;
int mid=l+r>>1;
modify(lc,l,mid,x,y,ei);
modify(rc,mid+1,r,x,y,ei);
}
void out(bt x)
{
int i=999;
while(i&&!x[i]) i--;
while(i>=0) cout<<x[i],i--;
cout<<"\n";
}
void query(int k,int l,int r,xxj now)
{
for(int i=0;i<op[k].size();i++)
{
Edge ei=op[k][i];
now.ins(dis[ei.nxt]^dis[ei.to]^ei.dis);
}
if(l==r){
out(now.qry());
return;
}
int mid=l+r>>1;
query(lc,l,mid,now);query(rc,mid+1,r,now);
}
char s[10];
int main()
{
int n,m,P,u,v;bt w;
cin>>n>>m>>P;
for(int i=1;i<=m;i++)
{
cin>>u>>v>>w;
add(u,v,w);add(v,u,w);
}
dfs(1,0,0);
out(glb.qry());
int etot=0,rnm=0;
for(int i=1;i<=P;i++)
{
cin>>s+1>>u;
switch(s[2])
{
case 'd':cin>>v>>w;qe[++etot]=Edge(u,v,w);l[etot]=i;id[++rnm]=etot;break;
case 'a':r[id[u]]=i-1;break;
case 'h':cin>>w;qe[++etot]=qe[id[u]];r[id[u]]=i-1;l[etot]=i;qe[etot].dis=w;id[u]=etot;break;
}
}
for(int i=1;i<=etot;i++) if(!r[i]) r[i]=P;
for(int i=1;i<=etot;i++) if(l[i]<=r[i]) modify(1,1,P,l[i],r[i],qe[i]);
query(1,1,P,glb);
return 0;
}