60WA求调
查看原帖
60WA求调
221030
封禁用户楼主2023/4/30 09:31

rt

#include <bits/stdc++.h>
using namespace std;
const int N=100000;
struct node
{
 int add_tag;
 int mul_tag;
 int sum;
}tree[4*N+5];
int x[N+5];
int n,m,p;
void built(int root,int l,int r)
{
 if(l==r)
 {
    tree[root].sum=x[l]%p;
    tree[root].add_tag=0;
    tree[root].mul_tag=1;
    return;
 }
 int mid=(l+r)/2;
 built(root*2,l,mid);
 built(root*2+1,mid+1,r);
 tree[root].sum=tree[root*2].sum+tree[root*2+1].sum;
 tree[root].add_tag=0;
 tree[root].mul_tag=1;
 tree[root].sum%=p;
}
void pushdown(int root,int l,int r)
{
 if(tree[root].mul_tag!=1)
 {
    tree[root*2].sum*=tree[root].mul_tag;
    tree[root*2].add_tag*=tree[root].mul_tag;
    tree[root*2].mul_tag*=tree[root].mul_tag;
    tree[root*2].sum%=p;
    tree[root*2].add_tag%=p;
    tree[root*2].mul_tag%=p;
    tree[root*2+1].sum*=tree[root].mul_tag;
    tree[root*2+1].add_tag*=tree[root].mul_tag;
    tree[root*2+1].mul_tag*=tree[root].mul_tag;
    tree[root*2+1].sum%=p;
    tree[root*2+1].add_tag%=p;
    tree[root*2+1].mul_tag%=p;
    tree[root].mul_tag=1;
 }
 if(tree[root].add_tag!=0)
 {
    int mid=(l+r)/2;
    tree[root*2].add_tag+=tree[root].add_tag;
    tree[root*2].sum=tree[root*2].sum+(mid-l+1)*tree[root].add_tag;
    tree[root*2].add_tag%=p;
    tree[root*2].sum%=p;
    tree[root*2+1].add_tag+=tree[root].add_tag;
    tree[root*2+1].sum=tree[root*2+1].sum+(r-mid)*tree[root].add_tag;
    tree[root*2+1].add_tag%=p;
    tree[root*2+1].sum%=p;
    tree[root].add_tag=0;
 }
}
void mul_change(int L,int R,int root,int l,int r,int d)
{
 if(L<=l&&R>=r)
 {
    tree[root].mul_tag=(tree[root].mul_tag*d)%p;
    tree[root].add_tag=(tree[root].add_tag*d)%p;
    tree[root].sum=(tree[root].sum*d)%p;
    return ;
 }
 int mid=(l+r)/2;
 pushdown(root,l,r);
 tree[root].sum=tree[root*2].sum+tree[root*2+1].sum;
 tree[root].sum%=p;
 if(L<=mid) mul_change(L,R,root*2,l,mid,d);
 if(R>mid)  mul_change(L,R,root*2+1,mid+1,r,d);
 tree[root].sum=tree[root*2].sum+tree[root*2+1].sum;
 tree[root].sum%=p;
}
void add_change(int L,int R,int root,int l,int r,int d)
{
 if(L<=l&&R>=r)
 {
    tree[root].add_tag=tree[root].add_tag+d;
    tree[root].sum+=(r-l+1)*d;
    tree[root].add_tag%=p;
    tree[root].sum%=p;
    return ;
 }
 int mid=(l+r)/2;
 pushdown(root,l,r);
 tree[root].sum=tree[root*2].sum+tree[root*2+1].sum;
 tree[root].sum%=p;
 if(L<=mid) add_change(L,R,root*2,l,mid,d);
 if(R>mid)  add_change(L,R,root*2+1,mid+1,r,d);
 tree[root].sum=tree[root*2].sum+tree[root*2+1].sum;
 tree[root].sum%=p;
}
int search(int L,int R,int root,int l,int r)
{
 if(L<=l&&R>=r)
    return tree[root].sum;
 pushdown(root,l,r);
 int mid=(l+r)/2,res=0;
 if(L<=mid) res+=search(L,R,root*2,l,mid),res%=p;
 if(R>mid)  res+=search(L,R,root*2+1,mid+1,r),res%=p;
 res%=p;
 return res;
}
int main()
{
 scanf("%d%d",&n,&p);
 for(int i=1;i<=n;i++)
    scanf("%d",&x[i]);
 built(1,1,n);
 scanf("%d",&m);
 while(m--)
 {
    int a1,a2,a3,a4;
    scanf("%d",&a1);
    if(a1==1)
    {
        scanf("%d%d%d",&a2,&a3,&a4);
        mul_change(a2,a3,1,1,n,a4);
    }
    if(a1==2)
    {
        scanf("%d%d%d",&a2,&a3,&a4);
        add_change(a2,a3,1,1,n,a4);
    }
    if(a1==3)
    {
        scanf("%d%d",&a2,&a3);
        printf("%d\n",search(a2,a3,1,1,n));
    }
 }
 return 0;
}
2023/4/30 09:31
加载中...