记录编号 |
366860 |
评测结果 |
AAAAAAAATTTTWWWATTWT |
题目名称 |
黑白树的操作 |
最终得分 |
45 |
用户昵称 |
Go灬Fire |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
37.655 s |
提交时间 |
2017-01-26 10:12:09 |
内存使用 |
10.04 MiB |
显示代码纯文本
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
const int maxn=150000;
const int maxm=350000;
struct Edge{
int next,to,dis;
}e[maxm*2];
int n,m,B[maxn],ans;
int vis[maxn],Time;
int len,head[maxn];
void Insert(int x,int y,int z){
len++;e[len].to=y;e[len].next=head[x];
e[len].dis=z;head[x]=len;
}
void Query(int x,int now){
if(vis[x]==Time)return;
vis[x]=Time;
if(B[x])ans+=now;
for(int i=head[x];i;i=e[i].next){
int j=e[i].to;
if(vis[j]!=Time)Query(j,now+e[i].dis);
}
}
void Init();
int main(){
freopen("MD5.in","r",stdin);freopen("MD5.out","w",stdout);
Init();
getchar();getchar();
return 0;
}
void Init(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
char type;scanf(" %c",&type);
if(type=='A'){
int x,y,z;scanf("%d%d%d",&x,&y,&z);
x^=ans;y^=ans;z^=ans;
Insert(x,y,z);Insert(y,x,z);
}
if(type=='C'){
int x;scanf("%d",&x);x^=ans;
B[x]=!B[x];
}
if(type=='Q'){
int x;scanf("%d",&x);x^=ans;
ans=0;Time++;
Query(x,0);
printf("%d\n",ans);
ans%=n;if(ans<0)ans+=n;
}
}
}