又见汉语题。
这里同样用到线段树处理,不过value值不是区间的值的和,而变成的区间(l,r)上的最大值,即为最大分数。
然后其他的跟hdu 1166的都一样了。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int Maxsize = 200010;
int maxx(int a,int b)/*value值来存当前区间的最大值,用maxx来比较*/
{
return a>b?a:b;
}
typedef struct/*结点信息*/
{
int value,r,l;
} node;
int data[Maxsize];
node tree[Maxsize*4];
int main()
{
void build(int v,int l,int r);
void update(int v,int num,int m);
int query(int v,int l,int r);
int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(int i = 1 ; i <= n ; i++)
{
scanf("%d",&data[i]);
}
build(1,1,n);
char ch[2];
int a,b;
for(int i = 0 ; i < m ; i++)
{
scanf("%s %d %d",ch,&a,&b);/*字符的控制要注意一下*/
if(ch[0] == 'Q')
{
printf("%d\n",query(1,a,b));
}
else if(ch[0] == 'U')
{
update(1,a,b);
}
}
}
return 0;
}
void build(int v,int l,int r)/*建树*/
{
tree[v].r = r;
tree[v].l = l;
if(r == l)
{
tree[v].value = data[r];
return;
}
int mid = (l+r)>>1;
build(v<<1,l,mid);
build(v<<1|1,mid+1,r);
tree[v].value = maxx(tree[v<<1].value,tree[v<<1|1].value);/*唯一的区别,value值的改变*/
}
void update(int v,int num,int m)/*依旧是单点更新*/
{
if(tree[v].r == tree[v].l && tree[v].l == num)
{
tree[v].value = m;
return;
}
int mid = (tree[v].r + tree[v].l)>>1;
if(num <= mid)
{
update(v<<1,num,m);
}
else
{
update(v<<1|1,num,m);
}
tree[v].value = maxx(tree[v<<1].value,tree[v<<1|1].value);
}
int query(int v,int l,int r)/*查询操作*/
{
if(tree[v].l == l && tree[v].r == r)
{
return tree[v].value;
}
int mid = (tree[v].r + tree[v].l)>>1;
if(mid >= r)
{
return query(v<<1,l,r);
}
else
{
if(l > mid)
{
return query(v<<1|1,l,r);
}
else
{
return maxx(query(v<<1,l,mid),query(v<<1|1,mid+1,r));
}
}
}