题意 :又是一道中问题,我就不说题意了。。。。
思路 : 线段树,这道题跟1166差不多,改一些地方就差不多了。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h> using namespace std; const int maxn = ;
int a[maxn] ;
int ans ;
struct node
{
int l,r,value ;
} Node[*maxn] ; void build(int v ,int l,int r)
{
Node[v].l = l ;
Node[v].r = r ;
Node[v].value = ;
if(l == r)
{
return ;
}
int mid = (l+r)>> ;
build(v*,l,mid) ;
build(v*+,mid+,r) ;
} int query(int v,int l,int r)
{
if(Node[v].l == l && Node[v].r == r)
return Node[v].value ;
int mid = (Node[v].l+Node[v].r) >> ;
if(r <= mid)
return query(v*,l,r) ;
else
{
if(l > mid)
return query(v*+,l,r) ;
else
return max(query(v*,l,mid),query(v*+,mid+,r) );
}
} void update(int v,int n,int m)
{ if(Node[v].value < m)
Node[v].value = m ;
if(Node[v].l == n && Node[v].r == n)
{
Node[v].value = m ;
return ;
}
else
{
int mid = (Node[v].l+Node[v].r)>> ;
if(n <= mid)
update(*v,n,m) ;
else if(n > mid)
update(*v+,n,m) ;
}
} int main()
{
int n,m ;
while(~scanf("%d %d",&n,&m))
{
build(,,n) ;
ans = ;
for(int i = ; i <= n ; i++)
{
scanf("%d",&a[i]) ;
update(,i,a[i]) ;
} char ch[] ;
for(int i = ; i <= m ; i++)
{
getchar() ;
scanf("%s",ch) ;
int a,b ;
if(ch[] == 'Q')
{
scanf("%d %d",&a,&b) ;
printf("%d\n",query(,a,b)) ;
}
else if(ch[] == 'U')
{
scanf("%d %d",&a,&b) ;
update(,a,b) ;
} }
}
return ;
}