题目链接:https://vjudge.net/problem/HDU-1754
题意略,详见上题目链接。
分析:区间修改与查询的题目,线段树求解,单点替换,区间最值。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#define L(u) (u<<1)
#define R(u) (u<<1|1)
using namespace std;
const int maxn=200005;
int a[maxn];
int ans;
struct Node{
int l,r;
int _max;
}node[maxn<<2];
void Pushup(int u){
node[u]._max=max(node[L(u)]._max,node[R(u)]._max);
return;
}
void Build(int u,int left,int right){
node[u].l=left;
node[u].r=right;
if(left==right){
node[u]._max=a[left];
return;
}
int mid=(left+right)>>1;
Build(L(u),left,mid);
Build(R(u),mid+1,right);
Pushup(u);
}
void Update(int u,int ID,int score){
if(node[u].l==node[u].r){
node[u]._max=score;
return;
}
int mid=(node[u].l+node[u].r)>>1;
if(mid>=ID) Update(L(u),ID,score);
else Update(R(u),ID,score);
Pushup(u);
}
void Quary(int u,int left,int right){
if(left==node[u].l&&node[u].r==right) {
ans=max(ans,node[u]._max);
return;
}
int mid=(node[u].l+node[u].r)>>1;
if(mid>=right) Quary(L(u),left,right);
else if(mid<left) Quary(R(u),left,right);
else {
Quary(L(u),left,mid);
Quary(R(u),mid+1,right);
}
return;
}
int main() {
//freopen("in.txt", "r", stdin);
int n,m;
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
Build(1,1,n);
char c;
int x,y;
while(m--){
ans=0;
scanf(" %c%d%d",&c,&x,&y);
if(c=='U') Update(1,x,y);
else{
Quary(1,x,y);
printf("%d\n",ans);
}
}
}
return 0;
}