WA!这里有一个只输出0的【模板】线段树2!

P3373 【模板】线段树 2

```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


|