线段树
问题描述
蒜头君有很多苹果,每个苹果都有对应的甜度值。
蒜头君现在想快速知道从第 i 个苹果到第 j 个苹果中,最甜的甜度值是多少。
因为存放时间久了,有的苹果会变甜,有的苹果会因为腐烂而变得不甜,所以蒜头君有时候还需要修改第 iii 个苹果的甜度值。
输入格式
第一行输入两个正整数N,M5 6
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5
样例输出
5
6
5
9
#include <iostream>
#include <cmath>
#include <cstdio>
#define maxn 2000010
using namespace std;
int s[maxn*4];
void up(int x)
{
s[x]=max(s[x*2],s[x*2+1]);
}
void wyh(int p,int l,int r,int x,int v)
{
if(l==r) {
s[p]=v;
return ;
}
int mid=(l+r)/2;
if(mid>=x) wyh(2*p,l,mid,x,v);
else wyh(2*p+1,mid+1,r,x,v);
up(p);
return ;
}
int king(int p,int l,int r,int x,int y)
{
if(x<=l&&y>=r)return s[p];
int mid=(l+r)/2,res=-1;
if(mid>=x)res=max(king(2*p,l,mid,x,y),res);
if(y>mid)res=max(king(2*p+1,mid+1,r,x,y),res);
return res;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int d;
cin>>d;
wyh(1,1,n,i,d);
}
getchar();
char a;
int i,j;
while(m--)
{
cin>>a;
cin>>i>>j;
if(a=='Q')
cout<<king(1,1,n,i,j)<<endl;
if(a=='U')
wyh(1,1,n,i,j);
}
return 0;
}