线段树单点更新类型 模板题:
#include<stdio.h>
#include<string.h>
const int N = 200005;
int s[N << 2];
int lc[N << 2];
int rc[N << 2];
int num[N];
int n,m;
void build(int u ,int l ,int r) {
if(l == r) {
s[u] = num[l];
lc[u] = rc[u] = l;
return;
}
int mid = (l + r) / 2;
build(u * 2 , l , mid);
build(u * 2 + 1 , mid + 1 ,r);
s[u] = s[u * 2] > s[u * 2 + 1] ? s[u * 2] : s[u * 2 + 1];
lc[u] = l;
rc[u] = r;
}
void mofiy(int u , int x ,int v) {
if(lc[u] == x && rc[u] == x) {
s[u] = v;
return ;
}
int mid = (lc[u] + rc[u]) / 2;
if(x <= mid)
mofiy(u * 2 , x , v);
else
mofiy(u * 2 + 1 , x, v);
s[u] = s[u * 2] > s[u * 2 + 1] ? s[u * 2] : s[u * 2 + 1];
}
int query(int u , int l ,int r) {
int ret = 0;
if(l <= lc[u] && r >= rc[u])
return s[u];
int mid = (lc[u] + rc[u]) / 2;
if(l <= mid) {
int temp = query(u * 2 , l ,r);
ret = ret > temp ? ret : temp;
}
if(r > mid) {
int temp = query(u * 2 + 1, l , r);
ret = ret > temp ? ret : temp;
}
return ret;
}
int main (){
while(scanf("%d%d",&n,&m) != EOF) {
for(int i = 1 ; i <= n ; i++) {
scanf("%d",&num[i]);
}
build(1 , 1 , n);
char str[10];
int p;
getchar();
while(m--) {
scanf("%s",str);
if(str[0] == 'U') {
int a,b;
scanf("%d%d",&a,&b);
mofiy(1 , a , b);
} else {
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",query(1 , a, b)) ;
}
}
}
}