/*
此题就是线段树的 单点跟新,区间最大值。
有不懂线段树的同学可以先看看这里
http://blog.csdn.net/lw277232240/article/details/77092634
*/
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define maxind 200000
int segTree[maxind * 4 + 10];
int array[maxind];
int n,m;
int max1(int x,int y)
{
if(x>y) return x;
return y;
}
void build(int node,int begin, int end)
{
if(begin==end)
{
segTree[node]=array[begin];
}
else
{
build(node*2,begin,(begin+end)/2);
build(node*2+1,(begin+end)/2+1,end);
segTree[node]=max1(segTree[node*2],segTree[node*2+1]);
}
}
int query(int node,int begin ,int end,int left,int right)
{
int p1, p2;
if(begin>right||end<left) return -1;
if(begin>=left&&end<=right) return segTree[node];
p1=query(node*2,begin,(begin+end)/2,left,right);
p2=query(node*2+1,(begin+end)/2+1,end,left,right);
return max1(p1,p2);
}
void Updata(int node,int begin,int end,int id,int add)//区间查询
{
if(begin==end)
{
segTree[node]=add;
return ;
}
int mid=(begin+end)/2;
if(id<=mid) Updata(node*2,begin,mid,id,add);
else Updata(node*2+1,mid+1,end,id,add);
segTree[node]=max1(segTree[node*2],segTree[node*2+1]);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&array[i]);
}
build(1,1,n);
char a[3];int x,y;
for(int i=1;i<=m;i++)
{
scanf("%s",a);
scanf("%d%d",&x,&y);
if(a[0]=='U')
{
Updata(1,1,n,x,y);
}
else
{
printf("%d\n",query(1,1,n,x,y));
}
}
}
}
hdu1754
最新推荐文章于 2021-08-01 13:10:32 发布