1 条题解
-
0
#include<bits/stdc++.h> #define lc(p) tr[p].ls #define rc(p) tr[p].rs using namespace std; typedef long long ll; int n,q,id,rt,a[200010]; mt19937 rd(999983); struct N{ int ls,rs,rd,v,la,sz; ll c; }tr[200010]; int nd(int v){ tr[++id]={0,0,rd(),v,0,1,v}; return id; } void pushup(int p){ tr[p].c=tr[p].v+tr[lc(p)].c+tr[rc(p)].c; tr[p].sz=tr[lc(p)].sz+tr[rc(p)].sz+1; } void pushdown(int p){ if(tr[p].la){ swap(lc(p),rc(p)); tr[lc(p)].la^=1; tr[rc(p)].la^=1; tr[p].la=0; } } void split(int p,int k,int &x,int &y){ if(!p){ x=y=0; return ; } pushdown(p); if(tr[lc(p)].sz<k){ x=p; split(rc(p),k-tr[lc(p)].sz-1,rc(p),y); } else{ y=p; split(lc(p),k,x,lc(p)); } pushup(p); } int merge(int x,int y){ if(!x||!y)return x|y; if(tr[x].rd<tr[y].rd){ pushdown(x); rc(x)=merge(rc(x),y); pushup(x); return x; } else{ pushdown(y); lc(y)=merge(x,lc(y)); pushup(y); return y; } } void change(int l,int r){ int x,y,z; split(rt,r,x,y); split(x,l-1,x,z); tr[z].la^=1; rt=merge(merge(x,z),y); } ll find(int l,int r){ int x,y,z; split(rt,r,x,y); split(x,l-1,x,z); ll ans=tr[z].c; rt=merge(merge(x,z),y); return ans; } int main(){ ios::sync_with_stdio(0); cin.tie(0); cin>>n>>q; for(int i=1;i<=n;i++){ cin>>a[i]; rt=merge(rt,nd(a[i])); } while(q--){ int op,l,r; cin>>op>>l>>r;l++; if(op==0)change(l,r); else cout<<find(l,r)<<'\n'; } return 0; }
- 1
信息
- ID
- 8136
- 时间
- 1000ms
- 内存
- 1024MiB
- 难度
- 9
- 标签
- 递交数
- 10
- 已通过
- 4
- 上传者