线段树2求调
  • 板块灌水区
  • 楼主Alea
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/7/25 19:01
  • 上次更新2023/11/3 07:41:03
查看原帖
线段树2求调
322792
Alea楼主2023/7/25 19:01

调过了基础模板,现在开始调2了。。。。。。

#include <iostream>
using namespace std;
#define int __int128
inline void read(int &n){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    n=x*f;
}
inline void print(int n){
    if(n<0){
        putchar('-');
        n*=-1;
    }
    if(n>9) print(n/10);
    putchar(n % 10 + '0');
}
const int size=1e5+7;
int arr[size]={},sum[size],add[size],mul[size],bg[size],ed[size],n,m,p;
void build(int k,int lf,int rt){
    bg[k]=lf,ed[k]=rt;
    add[k]=0,mul[k]=1;
    if(lf==rt) sum[k]=arr[lf];
    else{
        int mi=lf+(rt-lf)/2;
        build(k*2,lf,mi),build(k*2+1,mi+1,rt);
        sum[k]=sum[k*2]+sum[k*2+1];
    }
    sum[k]%=p;
}
void pudn(int k){
    sum[k*2]=(sum[k*2]*mul[k]+(add[k]*(ed[k*2]-bg[k*2]+1))%p)%p;
    sum[k*2+1]=(sum[k*2+1]*mul[k]+(add[k]*(ed[k*2+1]-bg[k*2+1]+1))%p)%p;
    mul[k*2]=mul[k*2]*mul[k]%p,mul[k*2+1]=mul[k*2+1]*mul[k]%p;
    add[k*2]=(add[k*2]*mul[k]+add[k])%p,add[k*2+1]=(add[k*2+1]*mul[k]+add[k])%p;
    mul[k]=1,add[k]=0;
}
void modadd(int k,int cl,int cr,int cv){
    if(cl<=bg[k]&&ed[k]<=cr){
        add[k]=(add[k]+cv)%p;
        sum[k]=(sum[k]+cv*(ed[k]-bg[k]+1))%p;
    }else{
        pudn(k);
        sum[k]=(sum[k*2]+sum[k*2+1])%p;
        if(cl<=ed[k*2]) modadd(k*2,cl,cr,cv);
        if(bg[k*2+1]<cr) modadd(k*2+1,cl,cr,cv);
        sum[k]=(sum[k*2]+sum[k*2+1])%p;
    }
}
void modmul(int k,int cl,int cr,int cv){
    if(cl<=bg[k]&&ed[k]<=cr) add[k]=add[k]*cv%p,mul[k]=mul[k]*cv%p,sum[k]=sum[k]*cv%p;
    else{
        pudn(k);
        sum[k]=(sum[k*2]+sum[k*2+1])%p;
        if(cl<=ed[k*2]) modadd(k*2,cl,cr,cv);
        if(bg[k*2+1]<cr) modadd(k*2+1,cl,cr,cv);
        sum[k]=(sum[k*2]+sum[k*2+1])%p;
    }
}
int query(int k,int ql,int qr){
    if(ql<=bg[k]&&ed[k]<=qr) return sum[k];
    pudn(k);
    int val=0;
    if(ql<=ed[k*2]) val=(val+query(k*2,ql,qr))%p;
    if(bg[k*2+1]<qr) val=(val+query(k*2+1,ql,qr))%p;
    return val;
}
signed main(){
    read(n),read(m),read(p);
    for(int i=1;i<=n;i++) read(arr[i]);
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int o,x,y,k;
        read(o),read(x),read(y);
        if(o==1) read(k),modmul(1,x,y,k);
        else if(o==2) read(k),modadd(1,x,y,k);
        else print(query(1,x,y)),putchar('\n');
    }
    return 0;
}
2023/7/25 19:01
加载中...