样例RE,玄关,求条
查看原帖
样例RE,玄关,求条
1269609
yiwugougou楼主2025/7/23 17:06
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN=50005;
int n,m;
int arr[MAXN];
struct Node{
    int l,r,d,ld,rd;
}tree[MAXN*4];
void push_up(int id){
	tree[id].ld=tree[id*2].ld;
    if(tree[id*2].ld==tree[id*2].r-tree[id*2].l+1){
    	tree[id].ld+=tree[id*2+1].ld;
    }
    tree[id].rd=tree[id*2+1].rd;
    if(tree[id*2+1].rd==tree[id*2+1].r-tree[id*2+1].l+1){
    	tree[id].rd+=tree[id*2].rd;
    }
    tree[id].d=max(max(tree[id*2].d,tree[id*2+1].d),tree[id*2+1].ld+tree[id*2].rd);
}
void build(int id,int l,int r){
    tree[id]={l,r,0,0,0};
    if(l==r){
        tree[id].d=tree[id].ld=tree[id].rd=arr[l];
        return;
    }
    int mid=(l+r)/2;
    build(id*2,l,mid);
    build(id*2+1,mid+1,r);
    push_up(id);
}
int query(int id,int x,int y){
	if(x<=tree[id].l && tree[id].r<=y){
    	return tree[id].d;
    }
    int d=0;
    int mid=(tree[id].l+tree[id].r)/2;
    if(tree[id*2].d>=d && x<=mid){
    	d=query(id*2,x,y);
    }
    if(tree[id*2].rd+tree[id*2+1].ld>=d){
        d=tree[id*2].rd+tree[id*2+1].ld;
    }
    if(tree[id*2+1].d>=d && y>mid){
    	d=query(id*2+1,x,y);
    }
    return d;
}
void update(int id,int l,int d){
	if(l==tree[id].l && tree[id].l==tree[id].r){
        tree[id].ld=tree[id].rd=tree[id].d=d;
        return;
    }
    int mid=(tree[id].r+tree[id].l)/2;
    if(l<=mid){
    	update(id*2,l,d);
    }else{
    	update(id*2+1,l,d);
    }
    push_up(id);
}
signed main(){
    cin>>n;
    cin>>m;
    for(int i=1;i<=n;i++){
        cin>>arr[i];
    }
    build(1,1,n);
    for(int i=1;i<=m;i++){
    	int op,d,x;
        cin>>op>>d>>x;
        if(d>x){
        	swap(d,x);
		}
        if(op==1){
            cout<<query(1,d,x)<<'\n';
        }else{
            update(1,d,x);
        }
    }
    return 0;
}

感觉是update错了

2025/7/23 17:06
加载中...