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; const int mod=998244353; int n,q,id,rt; ll a[500010]; mt19937 rd(999983); struct N{ int ls,rs,rd; ll v; int lav; ll sz,c,la1,la2; }tr[2000010]; int nd(int v){ tr[++id]={0,0,rd(),v,0,1,v,1,0}; return id; } void pushup(int p){ tr[p].c=tr[p].v; tr[p].sz=1; if(lc(p)){ tr[p].c=(tr[p].c+tr[lc(p)].c)%mod; tr[p].sz+=tr[lc(p)].sz; } if(rc(p)){ tr[p].c=(tr[p].c+tr[rc(p)].c)%mod; tr[p].sz+=tr[rc(p)].sz; } } void pushdown(int p){ if(tr[p].lav){ swap(lc(p),rc(p)); tr[lc(p)].lav^=1; tr[rc(p)].lav^=1; tr[p].lav=0; } if(tr[p].la1!=1){ if(lc(p)){ tr[lc(p)].v=tr[lc(p)].v*tr[p].la1%mod; tr[lc(p)].c=tr[lc(p)].c*tr[p].la1%mod; tr[lc(p)].la1=tr[lc(p)].la1*tr[p].la1%mod; tr[lc(p)].la2=tr[lc(p)].la2*tr[p].la1%mod; } if(rc(p)){ tr[rc(p)].v=tr[rc(p)].v*tr[p].la1%mod; tr[rc(p)].c=tr[rc(p)].c*tr[p].la1%mod; tr[rc(p)].la1=tr[rc(p)].la1*tr[p].la1%mod; tr[rc(p)].la2=tr[rc(p)].la2*tr[p].la1%mod; } tr[p].la1=1; } if(tr[p].la2){ if(lc(p)){ tr[lc(p)].v=(tr[lc(p)].v+tr[p].la2)%mod; tr[lc(p)].c=(tr[lc(p)].c+tr[p].la2*tr[lc(p)].sz%mod)%mod; tr[lc(p)].la2=(tr[lc(p)].la2+tr[p].la2)%mod; } if(rc(p)){ tr[rc(p)].v=(tr[rc(p)].v+tr[p].la2)%mod; tr[rc(p)].c=(tr[rc(p)].c+tr[p].la2*tr[rc(p)].sz%mod)%mod; tr[rc(p)].la2=(tr[rc(p)].la2+tr[p].la2)%mod; } tr[p].la2=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 ins(int k,int v){ int x,y; split(rt,k,x,y); rt=merge(merge(x,nd(v)),y); } void del(int k){ int x,y,z; split(rt,k,x,y); split(x,k-1,x,z); rt=merge(x,y); } void reverse(int l,int r){ int x,y,z; split(rt,r,x,y); split(x,l-1,x,z); tr[z].lav^=1; rt=merge(merge(x,z),y); } void change(int l,int r,ll b,ll c){ int x,y,z; split(rt,r,x,y); split(x,l-1,x,z); tr[z].v=(tr[z].v*b%mod+c)%mod; tr[z].c=(tr[z].c*b%mod+c*tr[z].sz%mod)%mod; tr[z].la1=tr[z].la1*b%mod; tr[z].la2=(tr[z].la2*b%mod+c)%mod; 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; cin>>op; if(op==0){ int k,v; cin>>k>>v; ins(k,v); } else if(op==1){ int k; cin>>k;k++; del(k); } else if(op==2){ int l,r; cin>>l>>r; l++; reverse(l,r); } else if(op==3){ int l,r; ll b,c; cin>>l>>r>>b>>c; l++; change(l,r,b,c); } else{ int l,r; cin>>l>>r; l++; cout<<find(l,r)<<'\n'; } } return 0; }
- 1
信息
- ID
- 8137
- 时间
- 5000ms
- 内存
- 1024MiB
- 难度
- 9
- 标签
- 递交数
- 26
- 已通过
- 3
- 上传者