提交记录
貌似所有 WA 的点都是read -, expected 2(((
之前push_down新建的是父亲节点然后就爆灵了
看TJ说建儿子节点 然而 WA 50pts(
求帮♂帮
#include <bits/stdc++.h>
#define ri register int
#define MAXN 50000001
#define sti static int
#define ll long long
#define u32 unsigned int
using namespace std;
inline void Syncwithme(){
ios::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);
}
namespace Mt19937{
#define TIME chrono::system_clock::now().time_since_epoch().count()
#ifdef debug
u32 Seed=114514;
#else
u32 Seed=TIME;
#endif
mt19937 rnd(Seed);
}; using namespace Mt19937;
namespace Persistable_Fhq{
sti root[1000011],siz[MAXN];
ll tot;
sti val[MAXN],son[MAXN][2];
ll sum[MAXN];
sti tag[MAXN];
static u32 pr[MAXN];
#define swp(a,b) a^=b^=a^=b
inline void update(int x){
siz[x]=siz[son[x][0]]+siz[son[x][1]]+1;
sum[x]=sum[son[x][0]]+sum[son[x][1]]+val[x];
}
inline void sync(int now,int lst){
tie(val[now],siz[now],son[now][0],son[now][1],pr[now],sum[now],tag[now])
=tie(val[lst],siz[lst],son[lst][0],son[lst][1],pr[lst],sum[lst],tag[lst]);
} //??STL??
inline int create(int x){
ri ret=++tot;
val[ret]=x,siz[ret]=1;
sum[ret]=x,tag[ret]=0;
pr[ret]=rnd();
return ret;
}
inline void push_down(int x){
if(!tag[x]) return;
if(son[x][0]){
ri New=++tot;
sync(New,son[x][0]);
son[x][0]=New;
}
if(son[x][1]){
ri New=++tot;
sync(New,son[x][1]);
son[x][1]=New;
}
tag[son[x][0]]^=1,tag[son[x][1]]^=1;
swp(son[x][0],son[x][1]),tag[x]=0;
}
#define Pii pair<int,int>
inline Pii split(int now,int k){
if(!now) return {0,0};
register Pii ret(0,0);
ri New=++tot;
push_down(now);
sync(New,now);
if(k>=siz[son[New][0]]+1){
ret=split(son[New][1],k-siz[son[New][0]]-1);
son[New][1]=ret.first;
update(New),ret.first=New;
} else{
ret=split(son[New][0],k);
son[New][0]=ret.second;
update(New),ret.second=New;
} return ret;
}
inline int merge(int l,int r){
if(!l||!r) return l|r;
if(pr[l]<pr[r]){
push_down(l);
son[l][1]=merge(son[l][1],r);
update(l); return l;
} else{
push_down(r);
son[r][0]=merge(l,son[r][0]);
update(r); return r;
}
}
inline void insert(int lst,int now,int p,int x){
root[now]=root[lst];
register Pii t1=split(root[now],p);
root[now]=merge(merge(t1.first,create(x)),t1.second);
}
inline void erase(int lst,int now,int p){
root[now]=root[lst];
register Pii t1=split(root[now],p-1);
register Pii t2=split(t1.second,1);
if(!t2.first) return;
t2.first=merge(son[t2.first][0],son[t2.first][1]);
root[now]=merge(t1.first,merge(t2.first,t2.second));
}
inline void reverse(int lst,int now,int l,int r){
root[now]=root[lst];
register Pii t1=split(root[now],l-1);
register Pii t2=split(t1.second,r-l+1);
tag[t2.first]^=1;
root[now]=merge(t1.first,merge(t2.first,t2.second));
}
inline int query(int lst,int now,int l,int r){
root[now]=root[lst];
register Pii t1=split(root[now],l-1);
register Pii t2=split(t1.second,r-l+1);
ri ret=sum[t2.first];
root[now]=merge(t1.first,merge(t2.first,t2.second));
return ret;
}
}; using namespace Persistable_Fhq;
inline void debug(int x){
if(!x)return;
debug(son[x][0]),
cout<<val[x]<<" ",
debug(son[x][1]);
}
inline void DeepDarkFantasy(int v){
cout<<"----DEBUG!----"<<endl;
debug(root[v]),cout<<endl;
cout<<"----ENDDE.----"<<endl;
}
const int inf=2147483647;
signed main()
{
Syncwithme();
//freopen("std.in","r",stdin);
//freopen("mine.out","w",stdout);
ri n,v,opt,l,r,id(0);
register ll lst(0);
cin>>n;
while(n--){
cin>>v>>opt;
//DeepDarkFantasy(v);
if(opt==1){
cin>>l>>r;
l^=lst,r^=lst;
insert(v,++id,l,r);
} else if(opt==2){
cin>>l; l^=lst;
erase(v,++id,l);
} else if(opt==3){
cin>>l>>r;
l^=lst,r^=lst;
reverse(v,++id,l,r);
} else{
cin>>l>>r;
l^=lst,r^=lst;
lst=query(v,++id,l,r);
cout<<lst<<endl;
}
}
return 0;
}