求助大佬!线段树50pts!WA#2,#5,#8-10
  • 板块P1531 I Hate It
  • 楼主KunHan
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/5/26 21:46
  • 上次更新2023/10/23 14:41:15
查看原帖
求助大佬!线段树50pts!WA#2,#5,#8-10
769374
KunHan楼主2023/5/26 21:46
#include<bits/stdc++.h>
#define MAXN 100005
#define lid id<<1
#define rid id<<1|1
using namespace std;

struct seg_tree{
	int l,r;
	int maxn = -105;
}tr[MAXN*4];

int a[MAXN],li,ri,n,m;
void pushup(int id){
	tr[id].maxn = max(tr[lid].maxn,tr[rid].maxn);
}

void build(int id,int l,int r){
	tr[id].l = l;
	tr[id].r = r;
	if(l==r){
		tr[id].maxn = a[l];
		return;
	}
	int mid = (l+r)>>1;
	build(lid,l,mid);
	build(rid,mid+1,r);
	pushup(id);
}

void modify(int id, int x, int v){
	if(tr[id].l == tr[id].r){
	  	tr[id].maxn = v;
		return;
	 }
	 int mid = (tr[id].l+tr[id].r) >> 1; 
	 modify(x<=mid?lid:rid, x, v);
	 tr[id].maxn = max(tr[lid].maxn,tr[rid].maxn);
}

int querymaxn(int id,int l,int r){
	if(l==tr[id].l&&r==tr[id].r){
		return tr[id].maxn;
	}
	int mid = (tr[id].l+tr[id].r)>>1;
	if(r<=mid)
		return querymaxn(lid,l,r);
	if(l>mid)
		return querymaxn(rid,l,r);
	return max(querymaxn(lid,l,mid),querymaxn(rid,mid+1,r));
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		char op;
		cin>>op;
		scanf("%d%d",&li,&ri);
		if(op=='Q'){
			printf("%d\n",querymaxn(1,li,ri));
		}
		else{
			modify(1,li,ri);
		}
	}
	return 0;
}


2023/5/26 21:46
加载中...