题目:
蒜头君有很多苹果,每个苹果都有对应的甜度值。
蒜头君现在想快速知道从第 i 个苹果到第 j 个苹果中,最甜的甜度值是多少。
因为存放时间久了,有的苹果会变甜,有的苹果会因为腐烂而变得不甜,所以蒜头君有时候还需要修改第 iii 个苹果的甜度值。
输入格式
第一行输入两个正整数N,M(0
5 6
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5
1
2
3
4
5
6
7
8
样例输出
5
6
5
9
AC代码:线段树
#include <iostream>
using namespace std;
int s[800005];
void up(int p){
s[p] = s[p * 2] >= s[p * 2 + 1] ? s[p * 2] : s[p * 2 + 1];
}
void modify(int p,int l,int r,int x,int v){
if(l == r){
s[p] = v;
return;
}
int mid = (l + r) / 2;
if(x <= mid){
modify(p * 2,l,mid,x,v);
}
else{
modify(p * 2 + 1,mid+1,r,x,v);
}
up(p);
}
int query(int p,int l,int r,int x,int y){
if( x <= l && y >= r){
return s[p];
}
int mid = (l + r) / 2;
int res1 = 0;
int res2 = 0;
if(x <= mid){
res1 = query(p * 2,l,mid,x,y);
}
if(y > mid){
res2 = query(p * 2 + 1,mid + 1,r,x,y);
}
return res1 >= res2 ? res1 : res2;
}
int main(){
int n;
cin>>n;
int operation;
cin>>operation;
for(int i=1;i<=n;++i){
int number;
cin>>number;
modify(1,1,n,i,number);
}
char qqqq;
for(int i=0;i!=operation;++i){
cin>>qqqq;
int x,y;
cin>>x>>y;
if( 'Q' == qqqq ){
cout<<query(1,1,n,x,y)<<endl;
}
else{
modify(1,1,n,x,y);
}
}
return 0;
}