Simple segment tree;
The portal:http://acm.hdu.edu.cn/showproblem.php?pid=1754
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 200005;
struct Node {
int value;
int Left;
int Right;
}Segment_Tree[MAXN<<2];
int a[MAXN];
int cnt ;
void Build_Tree(int Left,int Right,int Now) {
Segment_Tree[Now].Left = Left;
Segment_Tree[Now].Right = Right;
if(Left == Right) {
Segment_Tree[Now].value = a[cnt++];
return ;
}
int Mid = (Left + Right) >> 1;
Build_Tree(Left,Mid,Now<<1);
Build_Tree(Mid+1,Right,Now<<1|1);
Segment_Tree[Now].value = max(Segment_Tree[Now<<1].value,Segment_Tree[Now<<1|1].value);
}
void Update_Tree(int Left,int Right,int Now,int position,int change_value) {
if(Left == Right) {
Segment_Tree[Now].value = change_value;
return;
}
int Mid = (Left + Right) >> 1;
if(position > Mid) {
Update_Tree(Mid+1,Right,Now<<1|1,position,change_value);
}
else {
Update_Tree(Left,Mid,Now<<1,position,change_value);
}
Segment_Tree[Now].value = max(Segment_Tree[Now<<1].value,Segment_Tree[Now<<1|1].value);
}
int Query_Tree(int Left,int Right,int Now,int Left_Edge,int Right_Edge) {
int Query_Ans = 0;
if(Left >= Left_Edge && Right <= Right_Edge) {
return Segment_Tree[Now].value;
}
int Mid = (Left + Right) >> 1;
if(Mid >= Left_Edge) {
Query_Ans = max(Query_Ans,Query_Tree(Left,Mid,Now<<1,Left_Edge,Right_Edge));
}
if(Mid < Right_Edge) {
Query_Ans = max(Query_Ans,Query_Tree(Mid+1,Right,Now<<1|1,Left_Edge,Right_Edge));
}
return Query_Ans;
}
void Deal_with() {
int n,m;
while(~scanf("%d %d",&n,&m)) {
for(int i = 1 ; i <= n ; i++) {
scanf("%d",a+i);
}
cnt = 1;
Build_Tree(1,n,1);
char tempc;
int position,value;
for(int i = 1 ; i <= m ; i++) {
getchar();
scanf("%c %d %d",&tempc,&position,&value);
if(tempc == 'U') {
Update_Tree(1,n,1,position,value);
}
else {
printf("%d\n",Query_Tree(1,n,1,position,value));
}
}
}
}
int main(void) {
//freopen("a.in","r",stdin);
Deal_with();
return 0;
}