线段树T五个点求条
查看原帖
线段树T五个点求条
828358
Carl170679楼主2025/8/5 11:01

记录

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define pb push_back
using namespace std;

int n,m;
int ma[800005],a[200005];

int read(){
    int x=0;
    char ch=getchar();
    while(ch<'0' or ch>'9'){
    	if(ch=='U'){
    		return 1;
		}
		else if(ch=='Q'){
			return 0;
		}
        ch=getchar();
    }
    while(ch>='0' and ch<='9'){
        x=x*10+(ch-'0');
        ch=getchar();
    }
    return x;
}

void build(int i,int l,int r){
	if(l==r){
		ma[i]=a[l];
		return;
	}
	int mid=l+r>>1;
	build(i<<1,l,mid);
	build(i<<1|1,mid+1,r);
	ma[i]=max(ma[i<<1],ma[i<<1|1]);
}

void modify(int i,int l,int r,int k,int x){
	if(l==r){
		ma[i]=max(ma[i],x);
		return;
	}
	int mid=l+r>>1;
	if(k<=mid){
		modify(i<<1,l,mid,k,x);
	}
	else{
		modify(i<<1|1,mid+1,r,k,x);
	}
	ma[i]=max(ma[i<<1],ma[i<<1|1]);
}

int query(int i,int l,int r,int ql,int qr){
	if(ql<=l and qr>=r){
		return ma[i];
	}
	if(l==r){
		return -1;
	}
	int ans=-1;
	int mid=l+r>>1;
	if(l<=mid){
		ans=max(ans,query(i<<1,l,mid,ql,qr));
	}
	if(r>mid){
		ans=max(ans,query(i<<1|1,mid+1,r,ql,qr));
	}
	return ans;
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	build(1,1,n);
	while(m--){
		int op=read(),x=read(),y=read();
		if(op){
			modify(1,1,n,x,y);
		}
		else{
			cout<<query(1,1,n,x,y)<<"\n";
		}
	}
	return 0;
}

2025/8/5 11:01
加载中...