题目链接:https://cn.vjudge.net/contest/269834#problem/B
题目大意:单点更新,区间查询。
题解:线段树。
代码:
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
struct node
{
int l,r,num;
}s[2000000];
int h[2000000];
int creat(int t,int l,int r)//建树
{
if(l==r)
{
s[t].l=l;
s[t].r=r;
return s[t].num=h[l];
}
s[t].l=l;
s[t].r=r;
return s[t].num=max(creat(t<<1,l,(l+r)>>1),creat((t*2)+1,((l+r)/2)+1,r));
}
void addre(int t,int a,int b)//单点更新
{
if(a==s[t].l&&a==s[t].r)
{
s[t].num=b;
return ;
}
if(((s[t].l+s[t].r)>>1)>=a)
{
addre(t*2,a,b);
}
else
{
addre(t*2+1,a,b);
}
s[t].num=max(s[t<<1].num,s[t*2+1].num);
}
int query(int t,int l,int r)//区间查询
{
int mid=(s[t].l+s[t].r)>>1;
if(s[t].l==l&&s[t].r==r)
{
return s[t].num;
}
if(mid>=r)
{
return query(t*2,l,r);
}
else if(mid<l)
{
return query(t*2+1,l,r);
}
else
{
return max(query(t*2,l,mid),query(t*2+1,mid+1,r));
}
}
int main()
{
int T;
int n;
int a,b;
char m;
while(~scanf("%d %d",&n,&T))
{
for(int i=1;i<=n;i++)
{
scanf("%d",&h[i]);
}
creat(1,1,n);
getchar();
for(int i=1;i<=T;i++)
{
scanf("%c",&m);
scanf("%d %d",&a,&b);
getchar();
if(m=='Q')
{
printf("%d\n",query(1,a,b));
}
else
{
addre(1,a,b);
}
}
}
return 0;
}