社区讨论
美
P1000超级玛丽游戏参与者 7已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @mi6mdl1q
- 此快照首次捕获于
- 2025/11/20 07:14 4 个月前
- 此快照最后确认于
- 2025/11/20 07:14 4 个月前
CPP
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
using namespace std;
const int maxn=100000;
struct node{
int l,r;
long long num,multi;
}tree[4*maxn];
int n,m,bp;
long long lazy[maxn*4];
void build(int rt,int l,int r)
{
tree[rt].l=l;
tree[rt].r=r;
tree[rt].multi=1;
if(l==r)
{
scanf("%lld",&tree[rt].num);
tree[rt].num%=bp;
return;
}
int mid=(l+r)/2;
build(2*rt,l,mid);
build(2*rt+1,mid+1,r);
tree[rt].num=tree[2*rt].num+tree[2*rt+1].num;
tree[rt].num%=bp;
}
void push_down(int rt)
{
//if(tree[rt].multi!=1)
{
lazy[2*rt]*=tree[rt].multi;
lazy[2*rt]%=bp;
lazy[2*rt+1]*=tree[rt].multi;
lazy[2*rt+1]%=bp;
tree[2*rt].multi*=tree[rt].multi;
tree[2*rt].multi%=bp;
tree[2*rt+1].multi*=tree[rt].multi;
tree[2*rt+1].multi%=bp;
tree[2*rt].num*=tree[rt].multi;
tree[2*rt].num%=bp;
tree[2*rt+1].num*=tree[rt].multi;
tree[2*rt+1].num%=bp;
tree[rt].multi=1;
}
//if(lazy[rt])
{
int mid=(tree[rt].l+tree[rt].r)/2;
lazy[2*rt]+=lazy[rt];
lazy[2*rt]%=bp;
lazy[2*rt+1]+=lazy[rt];
lazy[2*rt+1]%=bp;
tree[2*rt].num+=lazy[rt]*(mid-tree[rt].l+1);
tree[2*rt].num%=bp;
tree[2*rt+1].num+=lazy[rt]*(tree[rt].r-mid);
tree[2*rt+1].num%=bp;
lazy[rt]=0;
}
}
void push_up(int rt)
{
tree[rt].num=tree[2*rt].num+tree[2*rt+1].num;
tree[rt].num%=bp;
}
void mul(int rt,int l,int r,int k)
{
if(l>tree[rt].r || r<tree[rt].l) return;
if(l<=tree[rt].l && tree[rt].r<=r)
{
tree[rt].multi*=k;
tree[rt].multi%=bp;
lazy[rt]*=k;
lazy[rt]%=bp;
tree[rt].num*=k;
tree[rt].num%=bp;
return;
}
push_down(rt);
mul(2*rt,l,r,k);
mul(2*rt+1,l,r,k);
push_up(rt);
}
void add(int rt,int l,int r,int k)
{
if(l>tree[rt].r || r<tree[rt].l) return;
if(l<=tree[rt].l && tree[rt].r<=r)
{
tree[rt].num+=k*(tree[rt].r-tree[rt].l+1);
tree[rt].num%=bp;
lazy[rt]+=k;
lazy[rt]%=bp;
return;
}
push_down(rt);
add(2*rt,l,r,k);
add(2*rt+1,l,r,k);
push_up(rt);
}
long long addup(int rt,int l,int r)
{
if(l>tree[rt].r || r<tree[rt].l) return 0;
if(l<=tree[rt].l && tree[rt].r<=r)
{
return tree[rt].num;
}
push_down(rt);
push_up(rt);
return addup(2*rt,l,r)+addup(2*rt+1,l,r);
}
int main()
{
scanf("%d%d%d",&n,&m,&bp);
build(1,1,n);
memset(lazy,0,sizeof(lazy));
for(int i=1;i<=m;i++)
{
int o,x,y,k;
scanf("%d%d%d",&o,&x,&y);
switch(o)
{
case 1:scanf("%d",&k);mul(1,x,y,k);break;
case 2:scanf("%d",&k);add(1,x,y,k);break;
case 3:printf("%lld\n",addup(1,x,y)%bp);break;
}
}
return 0;
}
回复
共 9 条回复,欢迎继续交流。
正在加载回复...