Wrong answer Too short on line 1020.
查看原帖
Wrong answer Too short on line 1020.
464822
zJx_Lm楼主2024/3/6 21:46

还diff了下输出和答案

#include <bits/stdc++.h>
#define re register
#define int long long
// #define ll long long
// #define lls long long
#define pir make_pair
#define fr first 
#define sc second
#define db double
using namespace std;
// const int mol=998244353;
const int maxn=2e5+10;
const int INF=1e9+10;
// inline int qpow(int a,int b) { int ans=1; while(b) { if(b&1) (ans*=a)%=mol; (a*=a)%=mol; b>>=1; } return ans; }
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;
}

// int check;
// vector<pair<int,int> > lazy[100010<<2]; 
#define lid id<<1
#define rid (id<<1)+1
struct TREE {
    long long ans; 
    int num,mul,adds; 
} tre[300000];
int n,mol,q,a[100000];
inline void build(int id,int l,int r) {
    // if(l==1&& r==3) cout<<"id: "<<id<<endl;
    tre[id].num=r-l+1; tre[id].mul=1;
    if(l==r) { tre[id].ans=a[l]%mol; return ; }
    int mid=(l+r)>>1;
    build(lid,l,mid); build(rid,mid+1,r); 
    tre[id].ans=(tre[lid].ans+tre[rid].ans)%mol;
}
inline void putdown(int id) {
    if(tre[id].num!=1) {
        (tre[lid].mul*=tre[id].mul)%=mol;
        (tre[lid].adds=tre[lid].adds*tre[id].mul%mol+tre[id].adds)%=mol;
        tre[lid].ans=(tre[lid].ans*tre[id].mul%mol+tre[id].adds*tre[lid].num%mol)%mol;
        (tre[rid].mul*=tre[id].mul)%=mol;
        (tre[rid].adds=tre[rid].adds*tre[id].mul%mol+tre[id].adds)%=mol;
        tre[rid].ans=(tre[rid].ans*tre[id].mul%mol+tre[id].adds*tre[rid].num%mol)%mol;
    }
    tre[id].mul=1,tre[id].adds=0;
}
inline void wor1(int id,int l,int r,int ll,int rr,int k) {
    if(ll<=l&&r<=rr) { (tre[id].mul*=k)%=mol; (tre[id].adds*=k)%=mol; (tre[id].ans*=k)%=mol; return ; }
    putdown(id); int mid=(l+r)>>1;
    if(ll<=mid) wor1(lid,l,mid,ll,rr,k);
    if(rr>mid) wor1(rid,mid+1,r,ll,rr,k);
    tre[id].ans=(tre[lid].ans+tre[rid].ans)%mol;
}
inline void wor2(int id,int l,int r,int ll,int rr,int k) {
    if(ll<=l&&r<=rr) { (tre[id].adds+=k)%=mol; (tre[id].ans+=tre[id].num*k%mol)%=mol; return ; }
    putdown(id);
    int mid=(l+r)>>1;
    if(ll<=mid) wor2(lid,l,mid,ll,rr,k);
    if(rr>mid) wor2(rid,mid+1,r,ll,rr,k);
    tre[id].ans=(tre[lid].ans+tre[rid].ans)%mol;
}
inline int query(int id,int l,int r,int ll,int rr) {
    if(r<ll||l>rr) return 0;
    putdown(id);
    if(ll<=l&&r<=rr) return tre[id].ans; 
    int mid=(l+r)>>1;
    return (query(lid,l,mid,ll,rr)+query(rid,mid+1,r,ll,rr))%mol;
}
signed main(void) {
    // freopen("plant3.in.txt","r",stdin);
    // freopen("ansss.txt","w",stdout);
    n=read(); q=read(); mol=read();
    for(re int i=1;i<=n;i++) a[i]=read();
    build(1,1,n);
    for(re int i=1,o,x,y,k;i<=q;i++) {
        o=read(); x=read(); y=read(); k=(o==3)? INF:read();
        if(o==3) printf("%lld\n",query(1,1,n,x,y));
        if(o==1) wor1(1,1,n,x,y,k);
        if(o==2) wor2(1,1,n,x,y,k);
    }
}
2024/3/6 21:46
加载中...