线段树 2 求调样例过全 WA

P3373 【模板】线段树 2

```cpp #include<map> #include<cmath> #include<stack> #include<queue> #include<vector> #include<cstdio> #include<string> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define ull unsigned long long #define INF 0x3f3f3f3f #define bug(x) cout<<"Bug "<<(x)<<endl #define el putchar('\n') #define sp putchar(' ') #define int ll using namespace std; inline int read() { int s=0,w=1; char ch=getchar(); while(ch<'0' || ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0' && ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } inline void write(int x) { if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); return; } const int N=1e5+10; int n,m,q; int a[N]; int mod; struct node { int sum,siz,plus,mul=1; }t[N*4]; void pushup(int p) { t[p].sum=(t[p*2].sum%mod+t[p*2+1].sum%mod)%mod; t[p].siz=t[p*2].siz+t[p*2+1].siz; return ; } void pushdown(int p,int l,int r) { int mid=(l+r)>>1; t[p*2].sum=(t[p*2].sum*t[p].mul+t[p].plus*(mid-l+1))%mod; t[p*2+1].sum=(t[p*2+1].sum*t[p].mul+t[p].plus*(r-mid))%mod; t[p*2].mul=(t[p*2].mul*t[p].mul)%mod; t[p*2+1].mul=(t[p*2+1].mul*t[p].mul)%mod; t[p*2].plus=(t[p*2].plus*t[p].mul+t[p].plus)%mod; t[p*2+1].plus=(t[p*2+1].plus*t[p].mul+t[p].plus)%mod; t[p].mul=1; t[p].plus=0; return ; } void build(int p,int l,int r) { if(l==r) { t[p].sum=a[l]%mod; t[p].siz=1; return ; } int mid=(l+r)>>1; build(p*2,l,mid); build(p*2+1,mid+1,r); pushup(p); return ; } void add(int p,int l,int r,int x,int y,int w) { if(y<l || x>r) return ; if(l>=x && r<=y) { t[p].sum=(t[p].sum%mod+(t[p].siz*w)%mod)%mod; t[p].plus=(w%mod+t[p].plus%mod)%mod; return ; } pushdown(p,l,r); int mid=(l+r)>>1; if(x<=mid) add(p*2,l,mid,x,y,w); if(y>=mid+1) add(p*2+1,mid+1,r,x,y,w); pushup(p); return ; } void mult(int p,int l,int r,int x,int y,int w) { if(y<l || x>r) return ; if(l>=x && r<=y) { t[p].sum=(t[p].sum*w)%mod; t[p].mul=(t[p].mul*w)%mod; return ; } pushdown(p,l,r); int mid=(l+r)>>1; if(x<=mid) mult(p*2,l,mid,x,y,w); if(y>=mid+1) mult(p*2+1,mid+1,r,x,y,w); pushup(p); return ; } int query(int p,int l,int r,int x,int y) { if(y<l || x>r) return 0; if(l>=x && r<=y) { return t[p].sum%mod; } pushdown(p,l,r); int res=0; int mid=(l+r)>>1; if(x<=mid) res=(res%mod+query(p*2,l,mid,x,y)%mod)%mod; if(y>=mid+1) res=(res%mod+query(p*2+1,mid+1,r,x,y)%mod)%mod; return res; } signed main() { freopen("P3373_1.in","r",stdin); // freopen(".out","w",stdout); n=read();m=read();q=read(); mod=q; for(int i=1;i<=n;i++) { a[i]=read(); } build(1,1,n); for(int i=1;i<=m;i++) { int op=read(),x=read(),y=read(),k; if(op==1) { k=read(); mult(1,1,n,x,y,k); } else if(op==2) { k=read(); add(1,1,n,x,y,k); } else { write(query(1,1,n,x,y)%mod);el; } // bug(query(1,1,n,x,x)); } return 0; } ```
by T1EM1E @ 2023-08-02 10:03:27


没去freopen?
by Ether13 @ 2023-08-02 17:01:44


@[htoworz](/user/515717) freopne 是调试用的
by T1EM1E @ 2023-08-02 17:48:28


@[T1EM1E](/user/643058) mult里 ``` if(l>=x && r<=y) { t[p].sum=(t[p].sum*w)%mod; t[p].mul=(t[p].mul*w)%mod; return ; } ``` $t[p].plus$也要×w
by Ether13 @ 2023-08-02 20:34:02


@[htoworz](/user/515717) 谢谢。 此贴终。
by T1EM1E @ 2023-08-02 20:51:59


|