标签:
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
5 6 5 9HintHuge input,the C function scanf() will work better than cin
#include<iostream>
#include<cstdio>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int MAX=200010;
int nu[MAX];
struct data{
int l,r,maxf;
}node[4*MAX];
void Build(int left,int right,int u){
node[u].l=left;node[u].r=right;
if(left==right){
node[u].maxf=nu[left];
return;
}
int mid=(left+right)/2;
Build(left,mid,2*u);
Build(mid+1,right,2*u+1);
node[u].maxf=max(node[2*u].maxf,node[2*u+1].maxf);
}
//询问
int query(int left,int right,int u){
if((node[u].l>=left)&&(node[u].r<=right))
return node[u].maxf;
int mid=(node[u].l+node[u].r)/2;
int ans=0;
if(left<=mid) ans=max(ans,query(left,right,2*u));
if(right>mid) ans=max(ans,query(left,right,2*u+1));
return ans;
}
//更新
int updata(int loc,int w,int u){
if(node[u].l==node[u].r){
node[u].maxf=w;
return 0;
}
if(loc<=node[2*u].r){
updata(loc,w,u*2);
}
else
updata(loc,w,u*2+1);
node[u].maxf=max(node[2*u].maxf,node[2*u+1].maxf);
return 0;
}
int main(){
int n,m,i,a,b;
char ch;
while(~scanf("%d%d",&n,&m)){
for(i=1;i<=n;++i)
scanf("%d",&nu[i]);
Build(1,n,1);
while(m--){
cin>>ch>>a>>b;
if(ch=='Q'){
a=query(a,b,1);
printf("%d\n",a);
}
else
updata(a,b,1);
}
}
return 0;
}标签:
原文地址:http://blog.csdn.net/qq_18062811/article/details/44854549