线段树维护区间最大值求调试
  • 板块学术版
  • 楼主xf20280111
  • 当前回复26
  • 已保存回复26
  • 发布时间2025/7/21 09:38
  • 上次更新2025/7/21 14:31:52
查看原帖
线段树维护区间最大值求调试
1411354
xf20280111楼主2025/7/21 09:38
#include<bits/stdc++.h>

using namespace std;

const int N = 2e6 + 10;

char ch;
inline void read(int &x){
    while((ch = getchar()) < 48 || ch > 57);
    x=ch ^ 48;
    while((ch = getchar()) < 58 && ch > 47)
        x = (x << 1)+(x << 3)+(ch ^ 48);
}
inline void write(const int &x){
    if(x > 9) write(x / 10);
    putchar(x % 10 + 48);
}

int n,m,a[N];

struct node{
	int maxn;
}t[4 * N];
void build(int l,int r,int p){
	if (l == r) {t[p].maxn = a[l];return;}
	int mid = (l + r) / 2;
	build(l,mid,(p << 1));
	build(mid + 1,r,(p << 1) + 1);
	t[p].maxn = max(t[(p << 1)].maxn,t[(p << 1) + 1].maxn);
}
void change(int l,int r,int p,int x,int v){
	if (l == r){t[p].maxn = v;return;}
	int mid = (l + r) / 2;
	if (x <= mid) change(l,mid,(p << 1),x,v);
	else change(mid + 1,r,(p << 1) + 1,x,v);
	t[p].maxn = max(t[(p << 1)].maxn,t[(p << 1) + 1].maxn);
}
int ask(int l,int r,int p,int ql,int qr){
	if (ql <= l and r <= qr) return t[p].maxn;
	int mid = (l + r) / 2;
	if (qr <= mid) return ask(l,mid,(p << 1),ql,qr);
	if (ql > mid) return ask(mid + 1,r,(p << 1) + 1,ql,qr);
	return max(ask(l,mid,(p << 1),ql,qr),ask(mid + 1,r,(p << 1) + 1,ql,qr));
}
int main(){
	read(n);read(m);
	for (int i = 1;i <= n;i++) read(a[i]);
	build(1,n,1);
	for (int i = 1;i <= m;i++){
		char op;op = getchar();
		int aa,bb;read(aa);read(bb);
		if (op == 'U') change(1,n,1,aa,bb);
		else{
			write(ask(1,n,1,aa,bb));
			putchar('\n');
		}
	}
	return 0;
}

2025/7/21 09:38
加载中...