编译器?????????
by xiaoyaowudi @ 2020-04-26 17:11:00
您CE了??????
by xiaoyaowudi @ 2020-04-26 17:11:19
码风太丑了别介意qwq
by bovine__kebi @ 2020-04-26 17:11:34
编译器可海星
by 小恐 @ 2020-04-26 17:11:44
@[xiaoyaowudi](/user/151623) 不是。。。是WA+RE+TLE,可能我说的有问题。。。
by bovine__kebi @ 2020-04-26 17:11:57
先pushdown再更新tag
by xiaoyaowudi @ 2020-04-26 17:14:01
@[xiaoyaowudi](/user/151623) 我去试试
by bovine__kebi @ 2020-04-26 17:14:37
@[xiaoyaowudi](/user/151623) 然而还是不对。。。
by bovine__kebi @ 2020-04-26 17:16:15
@[bovine__kebi](/user/294736) 大概是%不完全
给份代码
```cpp
#include<cstdio>
#include<iostream>
#include<cstring>
#define lc(k) k << 1
#define rc(k) k << 1 | 1
const int MAXN = 100001;
inline int read() {
int x = 0;char ch = getchar();
while(ch > '9' || ch < '0') ch = getchar();
do x = x * 10 + ch - 48,ch = getchar();while(ch >= '0' && ch <= '9');
return x;
}
inline void print(const long long &x) {
if(x > 9) print(x / 10ll);
std::putchar(x % 10 + 48ll);
}
int n,m,p;
long long sum[MAXN << 2],plus[MAXN << 2],times[MAXN << 2];
void PrintPlus(int k,int l,int r,int v) {
sum[k] = (sum[k] + (r - l + 1) * 1ll * v) % p;
plus[k] = (plus[k] + v) % p;
}
void PrintTimes(int k,int v) {
sum[k] = sum[k] * 1ll * v % p;
plus[k] = plus[k] * 1ll * v % p;
times[k] = times[k] * 1ll * v % p;
}
void PushDown(int k,int l,int r) {
int mid = (l + r) >> 1;
PrintTimes(lc(k),times[k]); PrintPlus(lc(k),l,mid,plus[k]);
PrintTimes(rc(k),times[k]); PrintPlus(rc(k),mid + 1,r,plus[k]);
times[k] = 1, plus[k] = 0;
}
void PushUp(int k) {
sum[k] = (sum[lc(k)] + sum[rc(k)]) % p;
}
void Build(int k,int l,int r) {
times[k] = 1;
plus[k] = 0;
if(l == r) {
sum[k] = read() % p;
return;
}
int mid = (l + r) >> 1;
Build(lc(k),l,mid);
Build(rc(k),mid + 1,r);
PushUp(k);
return;
}
void UpdatePlus(int k,int l,int r,int x,int y,int v) {
if(l > y || r < x) return;
if(l >= x && r <= y) {
PrintPlus(k,l,r,v);
return;
}
int mid = (l + r) >> 1;
PushDown(k,l,r);
UpdatePlus(lc(k),l,mid,x,y,v);
UpdatePlus(rc(k),mid + 1,r,x,y,v);
PushUp(k);
return;
}
void UpdateTimes(int k,int l,int r,int x,int y,int v) {
if(l > y || r < x) return;
if(l >= x && r <= y) {
PrintTimes(k,v);
return;
}
int mid = (l + r) >> 1;
PushDown(k,l,r);
UpdateTimes(lc(k),l,mid,x,y,v);
UpdateTimes(rc(k),mid + 1,r,x,y,v);
PushUp(k);
return;
}
long long Query(int k,int l,int r,int x,int y) {
if(l > y || r < x) return 0ll;
if(l >= x && r <= y) return sum[k];
int mid = (l + r) >> 1;
PushDown(k,l,r);
return (Query(lc(k),l,mid,x,y) + Query(rc(k),mid + 1,r,x,y)) % p;
}
int main() {
n = read(), m = read(), p = read();
Build(1,1,n);
int op,l,r,x;
while(m--) {
op = read();
l = read(), r = read();
//for(int i = 1;i <= 15;i++) std::printf("%d ",sum[i]);
//std::putchar('\n');
//for(int i = 1;i <= 15;i++) std::printf("%d ",plus[i]);
//std::putchar('\n');
//for(int i = 1;i <= 15;i++) std::printf("%d ",times[i]);
//std::putchar('\n');
if(op == 1) {x = read(); UpdateTimes(1,1,n,l,r,x);}
if(op == 2) {x = read(); UpdatePlus(1,1,n,l,r,x);}
if(op == 3) {print(Query(1,1,n,l,r) % p); std::putchar('\n');}
}
return 0;
}
```
by Vocalise @ 2020-04-26 17:41:11
(线段树开四倍空间啊)
by StarLbright40 @ 2020-04-26 17:41:35