30pts线段树求调
查看原帖
30pts线段树求调
722836
lilincong楼主2023/5/27 15:58
#include <bits/stdc++.h>
using namespace std;

const int N=1e6;

#define ll long long

struct node
{
    int l,r;
    ll data;
    ll tag1;//加
    ll tag2;//乘
};

int n,m,mod;
ll a[N];
node t[N];

void build(int p,int l,int r)
{
    t[p].l=l;
    t[p].r=r;
    t[p].tag1=0;
    t[p].tag2=1;
    if (l==r)
    {
        t[p].data=a[l];
        return ;
    }
    int mid=(l+r)/2;
    build(p*2,l,mid);
    build(p*2+1,mid+1,r);
    t[p].data=(t[p*2].data+t[p*2+1].data)%mod;
}

void pushdown(int u)
{
    t[u*2].data*=t[u].tag2;
    t[u*2].data%=mod;

    t[u*2+1].data*=t[u].tag2;
    t[u*2+1].data%=mod;

    t[u*2].tag2*=t[u].tag2;
    t[u*2+1].tag2*=t[u].tag2;

    t[u*2].tag2%=mod;
    t[u*2+1].tag2%=mod;

    t[u*2].data+=(t[u*2].r-t[u*2].l+1)*t[u].tag1;
    t[u*2].data%=mod;

    t[u*2+1].data+=(t[u*2+1].r-t[u*2+1].l+1)*t[u].tag1;
    t[u*2+1].data%=mod;

    t[u*2].tag1+=t[u].tag1;
    t[u*2+1].tag1+=t[u].tag1;

    t[u*2].tag1%=mod;
    t[u*2+1].tag1%=mod;

    t[u].tag1=0;
    t[u].tag2=1;
    return ;
}

void add1(int p,int l,int r,int k)
{
    if (l<=t[p].l && t[p].r<=r)
    {
        t[p].data+=(t[p].r-t[p].l+1)*k;
        t[p].data%=mod;
        t[p].tag1+=k;
        t[p].tag1%=mod;
        return ;
    }
    int mid=(t[p].l+t[p].r)/2;
    pushdown(p);
    if (l<=mid)
    {
        add1(p*2,l,r,k);
    }
    if (r>mid)
    {
        add1(p*2+1,l,r,k);
    }
    t[p].data=(t[p*2].data+t[p*2+1].data)%mod;
}

void add2(int p,int l,int r,int k)
{
    if (l<=t[p].l && t[p].r<=r)
    {
        t[p].data*=k;
        t[p].data%=mod;
        t[p].tag1*=k;
        t[p].tag2*=k;
        t[p].tag1%=mod;
        t[p].tag2%=mod;
        return ;
    }
    int mid=(t[p].l+t[p].r)/2;
    pushdown(p);
    if (l<=mid)
    {
        add2(p*2,l,r,k);
    }
    if (r>mid)
    {
        add2(p*2+1,l,r,k);
    }
    t[p].data=(t[p*2].data+t[p*2+1].data)%mod;
}

int ask(int p,int l,int r)
{
    ll ans=0;
    if (l<=t[p].l && t[p].r<=r)
    {
        return t[p].data;
    }
    pushdown(p);
    int mid=(t[p].l+t[p].r)/2;
    if (l<=mid)
    {
        ans+=ask(p*2,l,r);
    }
    if (r>mid)
    {
        ans+=ask(p*2+1,l,r);
    }
    return ans%mod;
}

int main()
{
    scanf("%d%d%d",&n,&m,&mod);
    for (int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    build(1,1,n);
    for (int i=1;i<=m;i++)
    {
        int op;
        scanf("%d",&op);
        if (op==1)
        {
            int x,y,k;
            scanf("%d%d%d",&x,&y,&k);
            add2(1,x,y,k);
        }
        else if (op==2)
        {
            int x,y,k;
            scanf("%d%d%d",&x,&y,&k);
            add1(1,x,y,k);
        }
        else
        {
            int x,y;
            scanf("%d%d",&x,&y);
            printf("%d\n",ask(1,x,y));
        } 
    }
    system("pause");
    return 0;
}
2023/5/27 15:58
加载中...