- 扶苏的问题
Lin的问题
- 2024-12-31 13:52:07 @
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 5;
const ll INF = 0x7fffffffffffffff;
int a[N];
ll d[N * 4],b[N * 4],c[N * 4];
bool v[N * 4];
inline void up(int p){d[p] = max(d[p * 2],d[p * 2 + 1]);}
void pd(int l,int r,int p){
if (v[p]){
d[p * 2] = b[p] + c[p],d[p * 2 + 1] = b[p] + c[p];
b[p * 2] = b[p],b[p * 2 + 1] = b[p];
c[p * 2] = c[p],c[p * 2 + 1] = c[p];
v[p * 2] = v[p],v[p * 2 + 1] = v[p];
v[p] = 0;
}else{
d[p * 2] += b[p],d[p * 2 + 1] += b[p];
b[p * 2] += b[p],b[p * 2 + 1] += b[p];
}
b[p] = 0;
}
void build(int l,int r,int p){
d[p] = -INF;
if (l == r){
d[p] = a[l];
// printf("%d:%d %d\n",l,p,d[p]);
return ;
}
int mid = l + (r - l >> 1);
build(l,mid,p * 2);
build(mid + 1,r,p * 2 + 1);
up(p);
}
void add(int tl,int tr,int l,int r,int p,ll x){
if (tl <= l && r <= tr){
d[p] += x;
b[p] += x;
// printf(" %d %d %d %d %d\n",p,d[p],b[p],c[p],v[p]);
return ;
}
pd(l,r,p);
int mid = l + (r - l >> 1);
if (tl <= mid) add(tl,tr,l,mid,p * 2,x);
if (mid < tr) add(tl,tr,mid + 1,r,p * 2 + 1,x);
up(p);
// printf(" %d %lld %d %d %d\n",p,d[p],b[p],c[p],v[p]);
}
void mod(int tl,int tr,int l,int r,int p,ll x){
if (tl <= l && r <= tr){
d[p] = x;
c[p] = x;
v[p] = 1;
b[p] = 0;
// printf(" %d %lld %d %d %d\n",p,d[p],b[p],c[p],v[p]);
return ;
}
pd(l,r,p);
int mid = l + (r - l >> 1);
if (tl <= mid) mod(tl,tr,l,mid,p * 2,x);
if (mid < tr) mod(tl,tr,mid + 1,r,p * 2 + 1,x);
up(p);
// printf(" %d %lld %d %d %d\n",p,d[p],b[p],c[p],v[p]);
}
ll query(int tl,int tr,int l,int r,int p){
if (l == r) return d[p];
pd(l,r,p);
int mid = l + (r - l >> 1);
ll mx = -INF;
if (tl <= mid) mx = max(mx,query(tl,tr,l,mid,p * 2));
if (mid < tr) mx = max(mx,query(tl,tr,mid + 1,r,p * 2 + 1));
return mx;
}
int main(int argc, char **argv){
// freopen("C:/Users/Administrator/Downloads/P1253_5.in","r",stdin);
// freopen("C:/Users/Administrator/Downloads/P1253_5.ans","w",stdout);
int n,q;
scanf("%d %d",&n,&q);
for (int i = 1;i <= n;i++){
scanf("%d",a + i);
}
build(1,n,1);
while (q--){
int op,l,r;
scanf("%d %d %d",&op,&l,&r);
if (op == 1){
ll x;
scanf("%lld",&x);
mod(l,r,1,n,1,x);
}else if (op == 2){
ll x;
scanf("%lld",&x);
add(l,r,1,n,1,x);
}else{
printf("%lld\n",query(l,r,1,n,1));
}
}
return 0;
}
/*
1
2 3
4 5 6 7
8 9 10 11 12 13 14 15
1 2 3 04 05 6
*/
2 comments
-
C23huangminzhe LV 7 @ 2024-12-31 19:09:08
已解决,死因是
query
写成单点查询了。🤣 2 -
2024-12-31 13:52:42@
哪位dalao能帮忙解决一下,40 TLE
QAQ
- 1
Information
- ID
- 294
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 9
- Tags
- # Submissions
- 105
- Accepted
- 6
- Uploaded By