@[所有人](/space/show?uid=88789)
by Brandon鹏 @ 2018-08-15 14:33:47
@everyone
by Brandon鹏 @ 2018-08-15 14:34:42
@[Planet6174](/space/show?uid=29762)
by Brandon鹏 @ 2018-08-15 14:36:34
@[lzc2001](/space/show?uid=19195)
by Brandon鹏 @ 2018-08-15 14:37:29
@[所有人](/space/show?uid=88789) @[所有人](/space/show?uid=88789) @[所有人](/space/show?uid=88789)
by Juanzhang @ 2018-08-15 14:39:25
@[小光](/space/show?uid=73934) 求救,大佬不要见死不救啊
by Brandon鹏 @ 2018-08-15 14:49:32
@[Brandon鹏](/space/show?uid=86154) ```cpp
#include<cstdio>
struct node
{
int l;
int r;
int sum;
int ts;
int tm;
}tree[100001*4];
int a[100001];
int n,m;
int p;
void se(int root,int s,int e)
{
tree[root].l=s;
tree[root].r=e;
tree[root].ts=0;
tree[root].tm=1;
if(s==e)
{
tree[root].sum=a[s];
}
else
{
se(root*2,s,(s+e)/2);
se(root*2+1,(s+e)/2+1,e);
tree[root].sum=(tree[root*2].sum+tree[root*2+1].sum)%p;
}
}
void pushdown(int root)
{
tree[root*2].sum=(tree[root*2].sum*tree[root].tm+tree[root].ts*(tree[root*2].r-tree[root*2].l+1))%p;
tree[root*2+1].sum=(tree[root*2+1].sum*tree[root].tm+tree[root].ts*(tree[root*2+1].r-tree[root*2+1].l+1))%p;
tree[root*2].tm=(tree[root].tm*tree[root*2].tm)%p;
tree[root*2+1].tm=(tree[root].tm*tree[root*2+1].tm)%p;
tree[root*2].ts=(tree[root*2].ts*tree[root].tm+tree[root].ts)%p;
tree[root*2+1].ts=(tree[root*2+1].ts*tree[root].tm+tree[root].ts)%p;
tree[root].ts=0;
tree[root].tm=1;
}
void mul(int root,int s,int e,int num)
{
if(tree[root].l==s&&tree[root].r==e)
{
tree[root].sum=(tree[root].sum*num)%p;
tree[root].ts=(tree[root].ts*num)%p;
tree[root].tm=(tree[root].tm*num)%p;
return;
}
pushdown(root);
if(e<=tree[root*2].r)
{
mul(root*2,s,e,num);
}
else
{
if(s>=tree[root*2+1].l)
{
mul(root*2+1,s,e,num);
}
else
{
mul(root*2,s,tree[root*2].r,num);
mul(root*2+1,tree[root*2+1].l,e,num);
}
}
tree[root].sum=(tree[root*2].sum+tree[root*2+1].sum)%p;
}
void add(int root,int s,int e,int num)
{
if(tree[root].l==s&&tree[root].r==e)
{
tree[root].sum=(tree[root].sum+num*(e-s+1))%p;
tree[root].ts=(tree[root].ts+num)%p;
return;
}
pushdown(root);
if(e<=tree[root*2].r)
{
add(root*2,s,e,num);
}
else
{
if(s>=tree[root*2+1].l)
{
add(root*2+1,s,e,num);
}
else
{
add(root*2,s,tree[root*2].r,num);
add(root*2+1,tree[root*2+1].l,e,num);
}
}
tree[root].sum=(tree[root*2].sum+tree[root*2+1].sum)%p;
}
int que(int root,int s,int e)
{
if(tree[root].l==s&&tree[root].r==e)
{
return tree[root].sum;
}
pushdown(root);
int ans=0;
if(e<=tree[root*2].r)
{
ans=(que(root*2,s,e))%p;
}
else
{
if(s>=tree[root*2+1].l)
{
ans=(que(root*2+1,s,e))%p;
}
else
{
ans=(que(root*2,s,tree[root*2].r)+ans)%p;
ans=(que(root*2+1,tree[root*2+1].l,e))%p;
}
}
return ans;
}
int main()
{
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
se(1,1,n);
for(int i=1;i<=m;i++)
{
int k;
scanf("%d",&k);
if(k==1)
{
int s,e,num;
scanf("%d%d%d",&s,&e,&num);
mul(1,s,e,num);
}
if(k==2)
{
int s,e,num;
scanf("%d%d%d",&s,&e,&num);
add(1,s,e,num);
}
if(k==3)
{
int s,e;
scanf("%d%d",&s,&e);
printf("%d\n",que(1,s,e));
}
}
return 0;
}
```
by Brandon鹏 @ 2018-08-15 14:49:57
@[Brandon鹏](/space/show?uid=86154)
```cpp
#include<cstdio>
struct node
{
int l;
int r;
int sum;
int ts;
int tm;
}tree[100001*4];
int a[100001];
int n,m;
int p;
void se(int root,int s,int e)
{
tree[root].l=s;
tree[root].r=e;
tree[root].ts=0;
tree[root].tm=1;
if(s==e)
{
tree[root].sum=a[s];
}
else
{
se(root*2,s,(s+e)/2);
se(root*2+1,(s+e)/2+1,e);
tree[root].sum=(tree[root*2].sum+tree[root*2+1].sum)%p;
}
}
void pushdown(int root)
{
tree[root*2].sum=(tree[root*2].sum*tree[root].tm+tree[root].ts*(tree[root*2].r-tree[root*2].l+1))%p;
tree[root*2+1].sum=(tree[root*2+1].sum*tree[root].tm+tree[root].ts*(tree[root*2+1].r-tree[root*2+1].l+1))%p;
tree[root*2].tm=(tree[root].tm*tree[root*2].tm)%p;
tree[root*2+1].tm=(tree[root].tm*tree[root*2+1].tm)%p;
tree[root*2].ts=(tree[root*2].ts*tree[root].tm+tree[root].ts)%p;
tree[root*2+1].ts=(tree[root*2+1].ts*tree[root].tm+tree[root].ts)%p;
tree[root].ts=0;
tree[root].tm=1;
}
void mul(int root,int s,int e,int num)
{
if(tree[root].l==s&&tree[root].r==e)
{
tree[root].sum=(tree[root].sum*num)%p;
tree[root].ts=(tree[root].ts*num)%p;
tree[root].tm=(tree[root].tm*num)%p;
return;
}
pushdown(root);
if(e<=tree[root*2].r)
{
mul(root*2,s,e,num);
}
else
{
if(s>=tree[root*2+1].l)
{
mul(root*2+1,s,e,num);
}
else
{
mul(root*2,s,tree[root*2].r,num);
mul(root*2+1,tree[root*2+1].l,e,num);
}
}
tree[root].sum=(tree[root*2].sum+tree[root*2+1].sum)%p;
}
void add(int root,int s,int e,int num)
{
if(tree[root].l==s&&tree[root].r==e)
{
tree[root].sum=(tree[root].sum+num*(e-s+1))%p;
tree[root].ts=(tree[root].ts+num)%p;
return;
}
pushdown(root);
if(e<=tree[root*2].r)
{
add(root*2,s,e,num);
}
else
{
if(s>=tree[root*2+1].l)
{
add(root*2+1,s,e,num);
}
else
{
add(root*2,s,tree[root*2].r,num);
add(root*2+1,tree[root*2+1].l,e,num);
}
}
tree[root].sum=(tree[root*2].sum+tree[root*2+1].sum)%p;
}
int que(int root,int s,int e)
{
if(tree[root].l==s&&tree[root].r==e)
{
return tree[root].sum;
}
pushdown(root);
int ans=0;
if(e<=tree[root*2].r)
{
ans=(que(root*2,s,e))%p;
}
else
{
if(s>=tree[root*2+1].l)
{
ans=(que(root*2+1,s,e))%p;
}
else
{
ans=(que(root*2,s,tree[root*2].r)+ans)%p;
ans=(que(root*2+1,tree[root*2+1].l,e))%p;
}
}
return ans;
}
int main()
{
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
se(1,1,n);
for(int i=1;i<=m;i++)
{
int k;
scanf("%d",&k);
if(k==1)
{
int s,e,num;
scanf("%d%d%d",&s,&e,&num);
mul(1,s,e,num);
}
if(k==2)
{
int s,e,num;
scanf("%d%d%d",&s,&e,&num);
add(1,s,e,num);
}
if(k==3)
{
int s,e;
scanf("%d%d",&s,&e);
printf("%d\n",que(1,s,e));
}
}
return 0;
}
```
by Brandon鹏 @ 2018-08-15 14:50:16
~~printf(“难受”);~~
by Brandon鹏 @ 2018-08-15 15:00:43
膜拜前排dalao
by Tarjan90° @ 2018-08-15 15:45:06