求助
  • 板块P1531 I Hate It
  • 楼主whssy
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/7/18 17:56
  • 上次更新2023/11/3 09:04:23
查看原帖
求助
809708
whssy楼主2023/7/18 17:56
#include<bits/stdc++.h>
#define int long long
using namespace std;
char ic(){
	char Ch_=getchar();
	while(Ch_==' '||Ch_=='\n')
		Ch_=getchar();
	return Ch_;
}
const int N=2e5+5;
int n,q,a[N];
struct line{
	int l,r,max,id,now;
};
line tree[N*4];
void build(int k,int l,int r){
	tree[k].l=l;tree[k].r=r;
	if(l==r){
		tree[k].max=a[l];
		return;
	}
	int mid=l+r>>1;
	build(2*k,l,mid);
	build(2*k+1,mid+1,r);
	tree[k].max=max(tree[2*k].max,tree[2*k+1].max);
}
void pushdown(int k){
	if(tree[k].now){
		if(tree[2*k].l<=tree[k].id&&tree[2*k].r>=tree[k].id){
			tree[2*k].id=tree[k].id;
			tree[2*k].now=tree[k].now;
		}else{
			tree[2*k+1].id=tree[k].id;
			tree[2*k+1].now=tree[k].now;
		}
	}
	tree[k].id=0;
	tree[k].now=0;
}
void change(int k,int id,int now){
	if(tree[k].l==tree[k].r){
		tree[k].max=now;
		return;
	}
	pushdown(k);
	int mid=tree[k].l+tree[k].r>>1;
	if(id<=mid) change(2*k,id,now);
	else change(2*k+1,id,now);
	tree[k].max=max(tree[2*k].max,tree[2*k+1].max);
}
int ask(int k,int L,int R){
	if(tree[k].l>=L&&tree[k].r<=R)
		return tree[k].max;
	pushdown(k);
	int mid=tree[k].l+tree[k].r>>1,ans=0;
	if(L<=mid) ans=max(ans,ask(2*k,L,R));
	if(R>mid) ans=max(ans,ask(2*k+1,L,R));
	return ans;
}
signed main(){
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	build(1,1,n);
	while(q--){
		char opt;
		cin>>opt;
		if(opt=='Q'){
			int l,r;
			scanf("%lld%lld",&l,&r);
			printf("%lld\n",ask(1,l,r));
		}else{
			int id,now;
			scanf("%lld%lld",&id,&now);
			change(1,id,now);
		}
	}
	return 0;
}
2023/7/18 17:56
加载中...