提交时间:2025-03-02 15:38:13
运行 ID: 37082
#include<bits/stdc++.h> #define ls(x) (x<<1) #define rs(x) (x<<1|1) using namespace std; const int N=15e5; const long long m=(1ll<<61); struct node{ __int128 sum,tag1,tag2; }t[N]; int id,n,q,k; char op; int l,r,w; void push_down(long long id,long long l,long long r){ long long mid=(l+r)>>1; t[ls(id)].sum=t[ls(id)].sum*t[id].tag1%m+t[id].tag2%m; t[rs(id)].sum=t[rs(id)].sum*t[id].tag1%m+t[id].tag2%m; t[ls(id)].tag1=t[ls(id)].tag1*t[id].tag1%m; t[rs(id)].tag1=t[rs(id)].tag1*t[id].tag1%m; t[ls(id)].tag2=(t[ls(id)].tag2*t[id].tag1+t[id].tag2)%m; t[rs(id)].tag2=(t[rs(id)].tag2*t[id].tag1+t[id].tag2)%m; t[id].tag1=1;t[id].tag2=0; } void build(long long id,long long l,long long r){ t[id].tag1=1; if(l==r){ return; } //t[id].tag1=1; long long mid=(l+r)>>1; build(ls(id),l,mid); build(rs(id),mid+1,r); } void update1(long long id,long long l,long long r,long long x,long long y,long long k){ if(x<=l&&r<=y){ t[id].tag1=t[id].tag1*k%m; t[id].tag2=t[id].tag2*k%m; t[id].sum=t[id].sum*k%m; return; } push_down(id,l,r); long long mid=(l+r)>>1; if(x<=mid) update1(ls(id),l,mid,x,y,k); if(mid<y) update1(rs(id),mid+1,r,x,y,k); } void update2(long long id,long long l,long long r,long long x,long long y,long long k){ if(x<=l&&r<=y){ t[id].tag2+=k; t[id].sum+=(r-l+1)*k; return; } push_down(id,l,r); long long mid=(l+r)>>1; if(x<=mid) update2(ls(id),l,mid,x,y,k); if(y>mid) update2(rs(id),mid+1,r,x,y,k); } void update3(long long id,long long l,long long r,long long x,long long y){ if(l==r){ if(t[id].sum>=0||t[id].sum%2==0) t[id].sum=t[id].sum/2; else t[id].sum=t[id].sum/2-1; return; } push_down(id,l,r); long long mid=(l+r)>>1; if(x<=mid) update3(ls(id),l,mid,x,y); if(y>mid) update3(rs(id),mid+1,r,x,y); } void ask(long long id,long long l,long long r,long long x){ if(l==r){ long long p=t[id].sum%m; cout<<p<<" "; return; } push_down(id,l,r); long long mid=(l+r)>>1; if(x<=mid) ask(ls(id),l,mid,x); else ask(rs(id),mid+1,r,x); } void print(long long id,long long l,long long r){ if(l==r){ int p=(t[id].sum%2+2)%2; cout<<p<<" "; return; } long long mid=(l+r)>>1; push_down(id,l,r); print(ls(id),l,mid); print(rs(id),mid+1,r); } int main(){ cin>>id>>n>>q>>k; build(1,1,n); for(int i=1;i<=q;i++){ cin>>op>>l>>r; if(op=='+'){ cin>>w; update2(1,1,n,l,r,w); } if(op=='-'){ cin>>w; update2(1,1,n,l,r,-w); } if(op=='*'){ cin>>w; update1(1,1,n,l,r,w); } if(op=='/') update3(1,1,n,l,r); //for(int i=1;i<=n;i++) ask(1,1,n,i); //cout<<endl; } print(1,1,n); }