/*
//5517620 2012-03-10 20:40:02 Accepted 1754 2046MS 6376K 1829 B G++ zjwzcnjsy
hdu1754-求区间最大值
*/
#include <stdio.h>
#include <string.h>
#define MAX 200000
#define max(a,b) a>b?a:b
struct TNode {
int l , r;
int score;
}segtree[4*MAX+5];
void build(int n,int l,int r)
{
int mid = (l+r)/2;
segtree[n].score = 0;
segtree[n].l = l;
segtree[n].r = r;
if(l!=r)
{
build(2*n,l,mid);
build(2*n+1,mid+1,r);
}
}
void insert(int n,int k,int c)
{
int mid=(segtree[n].l+segtree[n].r)/2;
if(segtree[n].l==segtree[n].r)
{
segtree[n].score=c;
return;
}
if(k<=mid)
{
insert(2*n,k,c);
}
else
{
insert(2*n+1,k,c);
}
segtree[n].score=max(segtree[2*n].score,segtree[2*n+1].score);
}
int question(int n,int l,int r)
{
int mid=(segtree[n].l+segtree[n].r)/2;
if(segtree[n].l==l && segtree[n].r==r)
{
return segtree[n].score;
}
if(r<=mid)
{
return question(2*n,l,r);
}
if(l>mid)
{
return question(2*n+1,l,r);
}
int i=question(2*n,l,mid);
int j=question(2*n+1,mid+1,r);
return i>j?i:j;
}
int main()
{
int n,m,i,t,x1,x2,c;
char ch;
while(scanf("%d%d",&n,&m)!=EOF)
{
build(1,1,n);
for(i=1;i<=n;i++)
{
scanf("%d",&t);
insert(1,i,t);
}
while(m--)
{
scanf("\n%c%d%d",&ch,&x1,&x2);
if(ch=='U')
{
insert(1,x1,x2);
}
else
{
printf("%d\n",question(1,x1,x2));
}
}
}
return 0;
}
hdu1754-线段树(求区间最大值)
最新推荐文章于 2024-08-10 09:03:15 发布