社区讨论
线段树20pts4种颜色求调
P1253扶苏的问题参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mdi9125m
- 此快照首次捕获于
- 2025/07/25 11:15 8 个月前
- 此快照最后确认于
- 2025/11/04 03:46 4 个月前
1,3AC
2,4WA
5-9TLE
10RE
CPP#include<bits/stdc++.h>
using namespace std;
#define int long long
struct node{
int v,l,r;
}a[1000001];
int n,b[100001],maxn=0,m;
void build(int l,int r,int pos){
a[pos].l=l,a[pos].r=r;
if(l==r){
a[pos].v=b[l];
return;
}
int mid=(l+r)/2;
build(l,mid,pos*2);
build(mid+1,r,pos*2+1);
a[pos].v=max(a[pos*2].v,a[pos*2+1].v);
}
void cx(int l,int r,int pos){
if(a[pos].l==l&&a[pos].r==r) {
maxn=max(a[pos].v,maxn);
return;
}
if(l==r){
maxn=max(b[l],maxn);
return;
}
int mid=(a[pos].l+a[pos].r)/2;
if(l>mid) cx(l,r,pos*2+1);
else if(r<=mid) cx(l,r,pos*2);
else{
cx(l,mid,pos*2);
cx(mid+1,r,pos*2+1);
}
}
void up(int l,int r,int x,int pos){
if(l==r&&a[pos].l==a[pos].r){
a[pos].v=x;
b[l]=x;
while(1){
pos/=2;
if(pos==0) break;
a[pos].v=max(a[pos*2].v,a[pos*2+1].v);
}
return;
}
int mid=(a[pos].l+a[pos].r)/2;
if(l>mid) up(l,r,x,pos*2+1);
else if(r<=mid) up(l,r,x,pos*2);
else{
up(l,mid,x,pos*2);
up(mid+1,r,x,pos*2+1);
}
}
void up2(int l,int r,int x,int pos){
if(l==r&&a[pos].l==a[pos].r){
a[pos].v+=x;
b[l]+=x;
while(1){
pos/=2;
if(pos==0) break;
a[pos].v=max(a[pos*2].v,a[pos*2+1].v);
}
return;
}
int mid=(a[pos].l+a[pos].r)/2;
if(l>mid) up(l,r,x,pos*2+1);
else if(r<=mid) up(l,r,x,pos*2);
else{
up(l,mid,x,pos*2);
up(mid+1,r,x,pos*2+1);
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>b[i];
build(1,n,1);
for(int i=1;i<=m;i++){
int op,l,r,x;
maxn=-1e9;
cin>>op;
if(op==1){
cin>>l>>r>>x;
up(l,r,x,1);
}
if(op==2){
cin>>l>>r>>x;
up2(l,r,x,1);
}
if(op==3){
cin>>l>>r;
cx(l,r,1);
cout<<maxn<<endl;
}
}
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...