http://acm.hdu.edu.cn/showproblem.php?pid=1754
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define MAX(x,y) ((x)>(y)?(x):(y))
//RMQ问题的<O(N),O(sqrt(N))>算法
//空间复杂度比线段树小一点,也可以解决动态RMQ问题
//查询修改的时间复杂度比线段树高,都是O(sqrt(N))
const int MAXN = 200020;
const int NINF = -1;
int N[MAXN],M[MAXN];
void prepare(int n,int &l,int &m)
{
int i,j,k,tmp;
l = (int)(sqrt(n));
m = (int)ceil(n*1.0/l);
for(i=0,j=0,k=0;i<n;i++,j++)
{
if((j%l)==0)
{
if(j!=0)
{
M[k++] = tmp;
}
tmp = N[i];
}
else
{
tmp = MAX(tmp,N[i]);
}
}
M[k++] = tmp;
}
int query(int a,int b,int n,int m,int l)
{
int mn = NINF;
int tmp,mb,me;
if((b-a+1)<l)
{
for(int i=a;i<=b;i++)
{
mn = MAX(mn,N[i]);
}
return mn;
}
if((a%l)!=0)
{
mb = (a/l+1);
tmp = mb*l;
for(int i=a;i<tmp;i++)
{
mn = MAX(mn,N[i]);
}
}
else
{
mb = a/l;
}
if(((b+1)%l)!=0&&b!=n-1)
{
me = (b/l-1);
tmp = b/l*l;
for(int i=tmp;i<=b;i++)
{
mn = MAX(mn,N[i]);
}
}
else
{
me = b/l;
}
for(int i=mb;i<=me;i++)
{
mn = MAX(mn,M[i]);
}
return mn;
}
void update(int a,int b,int l,int n)
{
int bg = (a/l)*l;
int tmp = NINF;
N[a] = b;
for(int i=bg;i<bg+l&&i<n;i++)//这都能写错!
{
tmp = MAX(tmp,N[i]);
}
M[a/l] = tmp;
}
int main()
{
//freopen("in.data","r",stdin);
//freopen("out.data1","w",stdout);
int n,l,m,q,a,b;
char cmd[2];
while(scanf("%d%d",&n,&q)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d",&N[i]);
}
prepare(n,l,m);
while(q--)
{
scanf("%s%d%d",cmd,&a,&b);
switch(cmd[0])
{
case 'Q':printf("%d\n",query(a-1,b-1,n,m,l));break;
case 'U':update(a-1,b,l,n);
}
}
}
return 0;
}