线段树不知道哪里写炸求调
  • 板块P1531 I Hate It
  • 楼主MornHus
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/2/26 11:29
  • 上次更新2023/10/23 23:43:19
查看原帖
线段树不知道哪里写炸求调
752094
MornHus楼主2023/2/26 11:29
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x7fffffffffffffff
ll read(){
	ll x=0;
	ll f=1;
	char c=getchar();
	while(c>'9'||c<'0'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<1)+(x<<3)+(c^'0');
		c=getchar();
	}
	return x*f;
}
int n,m;
ll a[200001];
ll tree[200001<<2];
void pushup(int x){
	tree[x]=max(tree[x<<1],tree[x<<1|1]);
}
void build(int x,int l,int r){
	if(l==r){
		tree[x]=a[l];
	}else{
		int mid=(l+r)>>1;
		build(x<<1,l,mid);
		build(x<<1|1,mid+1,r);
		pushup(x);
	}
}
void update(int x,int l,int r,int T,int b){
	if(l==r){
		if(tree[x]<b)tree[x]=b;
	}else{
		int mid=(l+r)>>1;
		if(T<=mid){
			update(x<<1,l,mid,T,b);
		}else{
			update(x<<1|1,mid+1,r,T,b);
		}
		pushup(x);
	}
}
ll query(int x,int l,int r,int L,int R){
	if(L<=l&&r<=R){
		return tree[x];
	}else{
		int mid=(l+r)>>1;
		ll res=-inf;
		if(L<=mid){
			res=max(res,query(x<<1,l,mid,L,R));
		}
		if(R>mid){
			res=max(res,query(x<<1,mid+1,r,L,R));
		}
		return res;
	}
}
void putout(){
	for(int i=1;i<=n;i++){
		cout<<query(1,1,n,i,i)<<' ';
	}
	cout<<endl;
}
int main(){
	n=read();
	m=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	build(1,1,n);
	char c;
	int le,ri;
	for(int i=1;i<=m;i++){
		cin>>c;
		le=read();
		ri=read();
		if(c=='Q'){
			printf("%lld\n",query(1,1,n,le,ri));
		}else{
			update(1,1,n,le,ri);
		}
	}
	return 0;
}
2023/2/26 11:29
加载中...