60pts玄关
查看原帖
60pts玄关
1076971
anke2017楼主2024/9/29 14:01

RT。全开 long long

#include<iostream>
#include<cstdio>

using namespace std;

#define int long long

const int inf=2e5;
int mod;

long long n[inf],tree[4*inf],lazy[4*inf],lazy2[4*inf];
inline int lson(int n){return n<<1;}
inline int rson(int n){return (n<<1)|1;}
inline void push_up_sum(int p)
{
    tree[p]=tree[lson(p)]+tree[rson(p)];
}
void btree(int a,int l,int r)
{
    if(l==r){tree[a]=n[l];return;}
    int mid=(l+r)>>1;
    btree(lson(a),l,mid);
    btree(rson(a),mid+1,r);
    push_up_sum(a);
}
inline void f_add(int now,int l,int r,long long p)
{
    lazy[now]=(lazy[now]+p)%mod;
    tree[now]=(p*(r-l+1)%mod+tree[now])%mod;
}
inline void f_mul(int now,int l,int r,long long p)
{
    tree[now]=tree[now]*p%mod;
    lazy[now]=lazy[now]*p%mod;
    lazy2[now]=lazy2[now]*p%mod;
}
inline void push_down(int now,int l,int r)
{
    int mid=(l+r)>>1;
    f_mul(lson(now),l,mid,lazy2[now]);
    f_mul(rson(now),mid+1,r,lazy2[now]);
    f_add(lson(now),l,mid,lazy[now]);
    f_add(rson(now),mid+1,r,lazy[now]);
    lazy[now]=0,lazy2[now]=1;
}
inline void change_add(int a,int l,int r,int lft,int rgt,long long add)
{
    if(lft<=l&&r<=rgt)
    {
        f_add(a,l,r,add);
        return;
    }
    push_down(a,l,r);
    int mid=(l+r)>>1;
    if(lft<=mid)change_add(lson(a),l,mid,lft,rgt,add);
    if(rgt>mid)change_add(rson(a),mid+1,r,lft,rgt,add);
    push_up_sum(a);
}
inline void change_mul(int a,int l,int r,int lft,int rgt,long long mul)
{
    if(lft<=l&&r<=rgt)
    {
        f_mul(a,l,r,mul);
        return;
    }
    push_down(a,l,r);
    int mid=(l+r)>>1;
    if(lft<=mid)change_mul(lson(a),l,mid,lft,rgt,mul);
    if(rgt>mid)change_mul(rson(a),mid+1,r,lft,rgt,mul);
    push_up_sum(a);
}
long long ask(int a,int l,int r,int lft,int rgt)
{
	if(lft<=l&&r<=rgt)return tree[a];
	int mid=(l+r)>>1;
	push_down(a,l,r);
	long long n=0;
	if(lft<=mid)n=ask(lson(a),l,mid,lft,rgt);
	if(rgt>mid)n+=ask(rson(a),mid+1,r,lft,rgt);
	return n%mod;
}
signed main()
{
    int a,b;
    cin>>a>>mod;
    for(int i=1;i<=4*a;i++)lazy2[i]=1;
    for(int i=1;i<=a;i++)
    {
        scanf("%lld",&n[i]);
    }
    cin>>b;
    btree(1,1,a);
    for(int i1=1;i1<=b;i1++)
    {
        int t1,t2,t3;
        cin>>t1>>t2>>t3;
        if(t1==1)
        {
            long long t4;
            cin>>t4;
            t4%=mod;
            change_mul(1,1,a,t2,t3,t4);
        }
        else if(t1==2)
        {
            long long t4;
            cin>>t4;
            t4%=mod;
            change_add(1,1,a,t2,t3,t4);
        }
        else
        {
            cout<<ask(1,1,a,t2,t3)<<'\n';
        }
    }
    return 0;
}
2024/9/29 14:01
加载中...