90pts蒟蒻求助
查看原帖
90pts蒟蒻求助
455490
Sharpsmile楼主2021/12/6 21:28

WA on #9

能取模的地方应该都取了。。。

//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#define int __int128_t
#define inlind inline void
#define inlinl inline bool
#define inlint inline int
#define inlinc inline char
#define inlins inline string
#define mem0(a) memset(a,0,sizeof(a))
#define memf(a) memset(a,0x3f,sizeof(a))
#define mem_f(a) memset(a,0x80,sizeof(a))
#define mem_1(a) memset(a,-1,sizeof(a))
#define pb(a,b) a.push_back(b)
#define mp(a,b) make_pair(a,b)
#define p1(x) x.first
#define p2(x) x.second
using namespace std;
struct seg{int l,r,sum,lazym,lazyp,mid;}segt[8*120000];
int n,m;
int a[1000300];
int p;
inlind bt(int id,int l,int r){
    int mid=(l+r)/2;
    if(l==r) {segt[id]={l,r,a[l]%p,1,0,mid};return ;}
        bt(id*2,l,mid);
    bt(id*2+1,mid+1,r);
    segt[id]={l,r,segt[id*2].sum+segt[id*2+1].sum,1,0,mid};
}
inlind upd(int id){
    segt[id].sum*=segt[id].lazym%p;
    segt[id].sum%=p;
    segt[id].sum+=segt[id].lazyp*(segt[id].r-segt[id].l+1)%p;
    segt[id].sum%=p;
    if(segt[id].l!=segt[id].r){
        segt[id*2].lazyp*=segt[id].lazym;
        segt[id*2].lazym*=segt[id].lazym;
        
        segt[id*2+1].lazyp*=segt[id].lazym;
        segt[id*2+1].lazym*=segt[id].lazym;
        
        segt[id*2].lazyp%=p;
        segt[id*2].lazym%=p;
                     
        segt[id*2+1].lazyp%=p;
        segt[id*2+1].lazym%=p;
        
        segt[id*2].lazyp+=segt[id].lazyp;
        segt[id*2+1].lazyp+=segt[id].lazyp;
        
        segt[id*2].lazyp%=p;
               
        segt[id*2+1].lazyp%=p;
        
    }
    segt[id].lazym=1;
    segt[id].lazyp=0;
    
}
inlint getsum(int id,int l,int r){
    if(segt[id].lazym!=1||segt[id].lazyp!=0)
   upd(id);
    if(segt[id].l==l&&r==segt[id].r){return segt[id].sum%p;}
    int mid=segt[id].mid;
    
    if(l>=mid+1)return getsum(id*2+1,l,r)%p;
    
    else if(r<=mid) return getsum(id*2,l,r)%p;
    
    else return (getsum(id*2,l,mid)+getsum(id*2+1,mid+1,r))%p;
}

inlind reb(int id,int l,int r,int x,int t){
   
    
    if(segt[id].l==l&&r==segt[id].r){
        if(t==1){
            segt[id].lazym*=x;
            segt[id].lazyp*=x;
            segt[id].lazyp%=p;
            segt[id].lazym%=p;
        }
        else {
            segt[id].lazyp+=x;
            segt[id].lazyp%=p;
        }
        return ;
        
    }
    else{
        
        
        
    if(t==1)
        
        segt[id].sum=(segt[id].sum+(x-1)*getsum(id,l,r)%p)%p;
    else{upd(id);
        segt[id].sum=(segt[id].sum+x*(r-l+1)%p)%p;
        
    }
        
    }
     int mid=segt[id].mid;
     if(l>=mid+1)reb(id*2+1,l,r,x,t);
     else if(r<=mid)reb(id*2,l,r,x,t);
     else {reb(id*2,l,mid,x,t);reb(id*2+1,mid+1,r,x,t);}

}
inlint re()
{
    int s = 0;
    char ch = getchar();
    while(!isdigit(ch))
        ch = getchar();
    while(isdigit(ch)) {
        s = s * 10 + ch - '0';
        ch = getchar();
    }
    return s;
}
inlind wr(int x){
    if(x>9) wr(x/10);
    putchar('0'+x%10);
}
signed main(){
    n=re();
    p=re();
    for(int i=1;i<=n;i++)a[i]=re();
    bt(1,1,n);
    m=re();
    for(int i=1;i<=m;i++){
        int op;
        op=re();
        if(op<=2){
            int l,r,x;
            l=re();
            r=re();
            x=re();
            reb(1,l,r,x%p,op);
        }
        else {
            int l,r;
            l=re();
            r=re();
                       
           wr(getsum(1,l,r)%p);
            putchar('\n');
        }
    }
   
    return 0;
}

2021/12/6 21:28
加载中...