```cpp
// luogu-judger-enable-o2
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long int lli;
const int maxn = 1e5 + 1;
struct seg
{
int l, r;
lli sum, tag, mul;
inline int mid(){ return (this->l+this->r)>>1; }
inline int len(){ return this->r-this->l+1; }
inline void moding(lli mod)
{
this->mul%=mod;
this->tag%=mod;
this->sum%=mod;
}
} tree[maxn << 2];
int n, m;
lli mod;
// inline void update(int rt);
inline void update(int rt)
{
int lson = rt << 1, rson = lson + 1;
tree[rt].sum = tree[lson].sum + tree[rson].sum;
tree[rt].sum %= mod;
}
inline void pushdown(int rt)
{
int lson = rt << 1, rson = lson + 1;
tree[lson].sum*=tree[rt].mul;
tree[lson].tag*=tree[rt].mul;
tree[lson].mul*=tree[rt].mul;
tree[lson].sum+=tree[lson].len()*tree[rt].tag;
tree[lson].tag+=tree[rt].tag;
//lson operating
tree[rson].sum*=tree[rt].mul;
tree[rson].tag*=tree[rt].mul;
tree[rson].mul*=tree[rt].mul;
tree[rson].sum+=tree[rson].len()*tree[rt].tag;
tree[rson].tag+=tree[rt].tag;
//rson operating
tree[lson].moding(mod);
tree[rson].moding(mod);
//mod
tree[rt].tag=0;
tree[rt].mul=1;
//origin node
}
void build_tree(int rt, int l, int r)
{
tree[rt].l = l, tree[rt].r = r;
if (l == r)
{
scanf("%lld", &tree[rt].sum);
tree[rt].tag = 0;
tree[rt].mul = 1;
return;
}
int mid = (l + r) >> 1;
build_tree(rt << 1, l, mid);
build_tree((rt << 1) + 1, mid + 1, r);
update(rt);
}
void change_seg1(int rt, int l, int r, lli add)
{
if (tree[rt].l==l&&tree[rt].r==r)
{
tree[rt].sum+=tree[rt].len()*add;
tree[rt].tag+=add;
tree[rt].sum%=mod;
tree[rt].tag%=mod;
return;
}
pushdown(rt);
int mid=tree[rt].mid();
if (r<=mid)change_seg1(rt<<1,l,r,add);
else if (l>mid)change_seg1(rt<<1|1,l,r,add);
else
{
change_seg1(rt<<1,l,mid,add);
change_seg1(rt<<1|1,mid+1,r,add);
}
update(rt);
}
void change_seg2(int rt, int l, int r, lli mul)
{
if (tree[rt].l==l&&tree[rt].r==r)
{
tree[rt].sum*=mul;
// tree[rt].sum%=mod;
tree[rt].tag*=mul;
// tree[rt].tag%=mod;
tree[rt].mul*=mul;
// tree[rt].mul%=mod;
tree[rt].moding(mod);
return;
}
pushdown(rt);
int mid=tree[rt].mid();
if (r<=mid)change_seg2(rt<<1,l,r,mul);
else if (l>mid)change_seg2(rt<<1|1,l,r,mul);
else
{
change_seg2(rt<<1,l,mid,mul);
change_seg2(rt<<1|1,mid+1,r,mul);
}
update(rt);
}
lli ask_seg(int rt, int l, int r)
{
if (tree[rt].l == l && tree[rt].r == r)
{
return tree[rt].sum%mod;
}
if (tree[rt].tag||tree[rt].mul!=1)
pushdown(rt);
int mid = (tree[rt].l + tree[rt].r) >> 1;
if (r <= mid)
return ask_seg(rt << 1, l, r)%mod;
else if (l > mid)
return ask_seg((rt << 1) + 1, l, r)%mod;
else
return (ask_seg(rt << 1, l, mid) + ask_seg((rt << 1) + 1, mid + 1, r))%mod;
}
int main()
{
cin >> n >> m >> mod;
build_tree(1, 1, n);
while (m--)
{
char flag;
int l, r;
lli num;
cin >> flag >> l >> r;
switch (flag)
{
case '1':{
scanf("%lld",&num);
change_seg2(1,l,r,num);
break;
}
case '2':{
scanf("%lld",&num);
change_seg2(1,l,r,num);
break;
}
default:{
printf("%lld\n",ask_seg(1,l,r)%mod);
break;
}
}
}
return 0;
}
```
by Jelly_Goat @ 2019-05-11 16:01:53
你骗人!我puts("0")交上去全WA了(滑稽
by t162 @ 2019-05-11 16:11:50
所以ta WA 了呀QAQ
by Fatalis_Lights @ 2019-05-11 16:15:54
# 骗人!我printf("0")交上去全WA了(滑稽
by Luban @ 2019-05-11 16:19:11