数据有误吗?为什么AC了?

P3373 【模板】线段树 2

```cpp #include<iostream> #include<cstdio> #define lson l, mid, rt<<1 #define rson mid+1, r, rt<<1|1 using namespace std; typedef long long ll; const int MAX = 100010; int n, m, p, x; ll a[MAX], tree[MAX<<2], col_mult[MAX<<2], col_add[MAX<<2]; void init() { int i; for (i = 1; i <= MAX<<2; i++) col_mult[i] = 1; return ; } void update(int rt) { tree[rt] = (tree[rt<<1] + tree[rt<<1|1])%p; return ; } void build(int l, int r, int rt) { if (l == r) { tree[rt] = a[l]; return ; } int mid = (l+r)>>1; build(lson); build(rson); update(rt); return ; } void color_add(int l, int r, int rt, ll v) { tree[rt] = (tree[rt] + (r-l+1)*v)%p; col_add[rt] = (col_add[rt] + v)%p; return ; } void color_mult(int rt, ll v) { tree[rt] = (tree[rt] * v)%p; col_mult[rt] = (col_mult[rt] * v)%p; col_add[rt] = (col_add[rt] * v)%p; return ; } void push_col(int l, int r, int rt) { if (col_mult[rt] != 1) { color_mult(rt<<1, col_mult[rt]); color_mult(rt<<1|1, col_mult[rt]); col_mult[rt] = 1; } int mid = (l+r)>>1; if (col_add[rt]) { color_add(lson, col_add[rt]); color_add(rson, col_add[rt]); col_add[rt] = 0; } return ; } void modify(int l, int r, int rt, int nowl, int nowr, ll v) { if (nowl <= l && nowr >= r) { if (x == 1) { color_mult(rt, v); return ; } if (x == 2) { color_add(l, r, rt, v); return ; } } int mid = (l+r)>>1; push_col(l, r, rt); if (nowl <= mid) modify(lson, nowl, nowr, v); if (nowr > mid) modify(rson, nowl, nowr, v); update(rt); return ; } ll query(int l, int r, int rt, int nowl, int nowr) { if (nowl <= l && nowr >= r) return tree[rt]%p; int mid = (l+r)>>1; push_col(l, r, rt); if (nowl <= mid) { if (nowr <= mid) return query(lson, nowl, nowr)%p; else return (query(lson, nowl, nowr) + query(rson, nowl, nowr))%p; } else return query(rson, nowl, nowr)%p; } int main() { init(); scanf("%d%d%d", &n, &m, &p); int i; for (i = 1; i <= n; i++) scanf("%lld", &a[i]); build(1, n, 1); int nowl, nowr; ll v; for (i = 1; i <= m; i++) { scanf("%d", &x); if (x == 1) { scanf("%d%d%d", &nowl, &nowr, &v); modify(1, n, 1, nowl, nowr, v); } if (x == 2) { scanf("%d%d%d", &nowl, &nowr, &v); modify(1, n, 1, nowl, nowr, v); } if (x == 3) { scanf("%d%d", &nowl, &nowr); printf("%lld\n", query(1, n, 1, nowl, nowr)%p); } } return 0; } ```
by 公元某年的猫 @ 2018-03-11 12:55:43


样例都过不了
by 公元某年的猫 @ 2018-03-11 12:56:28


这只能说明数据弱
by _LiM @ 2018-03-11 13:18:43


|