朴素线段树为什么只有9分
查看原帖
朴素线段树为什么只有9分
800543
NirvanaCeleste楼主2024/7/17 19:08
#include <bits/stdc++.h>
using namespace std;
inline void read(int& qin){
	int qout = 0, w = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9'){
		if(ch == '-') w = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9'){
		qout = qout * 10 + ch - '0';
		ch = getchar();
	}
	qin = qout * w;
}
inline void write(int x){
	if(x < 0) putchar('-'),x = -x;
	if(x > 9) write(x/10);
	putchar(x % 10 + '0');
}
int n,m;
int now[500050],t[500050 * 4];
inline int ls(int p){return p<<1;}
inline int rs(int p){return p<<1|1;}
void push_up(int p) {t[p] = max(t[ls(p)],t[rs(p)]);}
void build(int p,int l,int r){
	if(l == r){
		t[p] = now[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p);
}
void move(int p,int l,int r,int cnt,int op){
	if(l == r){
		t[p] = cnt;
		return;
	}
	int mid = (l + r) >> 1;
	if(op <= mid) move(ls(p),l,mid,cnt,op);
	else move(rs(p),mid+1,r,cnt,op);
	push_up(p);
}
int check(int lc,int rc,int p,int l,int r){
	int res = INT_MIN;
	if(lc <= l && r <= rc) return t[p];
	int mid = (l + r) >> 1;
	if(lc <= mid) res = max(res,check(lc,rc,ls(p),l,mid));
	if(rc > mid) res = max(res,check(lc,rc,rs(p),mid+1,r));
	return res;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) read(now[i]);
	build(1,1,n);
	int k,a,b,l,r;
	for(int i=1;i<=m;i++){
		read(k),read(a),read(b);
		if(k == 1){
			l = min(a,b),r = max(a,b);
			write(check(l,r,1,1,n));
			putchar('\n');
		}
		else move(1,1,n,b,a);
	}
	return 0;
}
2024/7/17 19:08
加载中...