#include<cstdio>
using namespace std;
struct edge
{
int lson,rson;
long long value,mul,add;
};
edge node[400001];
long long a[400001];
int n,p;
int read()
{
int w=0,c=1;
char ch=getchar();
while (ch<'0' || ch>'9')
{
if (ch=='-')
c=-1;
ch=getchar();
}
while (ch>='0' && ch<='9')
{
w=w*10+ch-'0';
ch=getchar();
}
return w*c;
}
void update(int s)
{
node[s].value=(node[s*2].value+node[s*2+1].value)%p;
}
void build(int s,int l,int r)
{
node[s].lson=l;
node[s].rson=r;
node[s].mul=1;
if (l==r)
{
node[s].value+=a[l]%p;
return;
}
build(s*2,l,(l+r)/2);
build(s*2+1,(l+r)/2+1,r);
update(s);
}
void pushdown(int s)
{
long long multiple,addup;
int t=node[s].rson-node[s].lson+1;
if (t==1)
return;
multiple=node[s].mul;
addup=node[s].add;
node[s].mul=1;
node[s].add=0;
node[s*2].value=(node[s*2].value*multiple+addup*(t-t/2))%p;
node[s*2+1].value=(node[s*2+1].value*multiple+addup*(t/2))%p;
node[s*2].mul=(node[s*2].mul*multiple)%p;
node[s*2+1].mul=(node[s*2+1].mul*multiple)%p;
node[s*2].add=(node[s*2].add*multiple+addup)%p;
node[s*2+1].add=(node[s*2+1].add*multiple+addup)%p;
}
void insert(int s,int x,int y,long long multiple,long long addup)
{
int mid;
pushdown(s);
int l=node[s].lson,r=node[s].rson;
if (l==x && y==r)
{
node[s].value=(node[s].value*multiple+addup*(r-l+1))%p;
node[s].mul=(node[s].mul*multiple)%p;
node[s].add=(node[s].add*multiple+addup)%p;
return;
}
mid=(l+r)/2;
if (y<=mid)
insert(s*2,x,y,multiple,addup);
else
if (x>mid)
insert(s*2+1,x,y,multiple,addup);
else
{
insert(s*2,x,mid,multiple,addup);
insert(s*2+1,mid+1,y,multiple,addup);
}
update(s);
}
long long query(int s,int x,int y)
{
int l=node[s].lson,r=node[s].rson,mid;
long long ans;
pushdown(s);
if (l==x && y==r)
return node[s].value;
mid=(l+r)/2;
if (y<=mid)
ans=query(s*2,x,y);
else
if (x>mid)
ans=query(s*2+1,x,y);
else
ans=(query(s*2,x,mid)+query(s*2+1,mid+1,y))%p;
update(s);
return ans;
}
int main()
{
int i,m,q,x,y,z;
n=read();
p=read();
for (i=1;i<=n;i++)
a[i]=read();
build(1,1,n);
m=read();
for (i=1;i<=m;i++)
{
q=read();
if (q==1)
{
x=read();
y=read();
z=read();
insert(1,x,y,z,0);
}
if (q==2)
{
x=read();
y=read();
z=read();
insert(1,x,y,1,z);
}
if (q==3)
{
x=read();
y=read();
printf("%lld\n",query(1,x,y)%p);
}
}
return 0;
}
10-02
1175
03-19
05-26
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交