今天为大家带来的仍然是线段树的题,emmmm,这个本来是想用树状数组来搞得,但是下午本来要去上海!!!!!!!!!没有学习,但是这两天那边有台风(听说17级,火车禁止通行),我又回来了,,退票费真贵。。。。。
看题 ,这个题仍然是不用二进制就会TLE的线段树。改了无数个bug,一边过的题,
昨天写的那个是,区间求和以及区间单点修改值,今天是区间求最大最小值。
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
Sample Output
5 6 5 9
#include <iostream>
using namespace std;
int d[4*200000];
int uphan(int m)
{
d[m]=max(d[m<<1|1],d[m<<1]);
}
void bulid(int p,int l,int r)
{
if(l==r)
{ //d[p]=0;
scanf("%d",&d[p]);
return ;
}
int mid=(l+r)>>1;
bulid(p<<1,l,mid);
bulid(p<<1|1,mid+1,r);
uphan(p);
}
void update(int flag,int pos,int l,int r,int p)
{
if(l==r&&r==flag)
{// cout<<"mm"<<d[p]<<endl;
d[p]=pos;
// cout<<"aa"<<d[p]<<endl;
return ;
}
int mid=(l+r)>>1;
if(flag<=mid)
update(flag,pos,l,mid,p<<1);
else
update(flag,pos,mid+1,r,p<<1|1);
uphan(p);
}
int getsum(int l,int r,int s,int t,int p)
{
if(l<=s&&t<=r)
{
return d[p];
}
int mmax=0,mid=(s+t)>>1;
if(l<=mid)
mmax=max(getsum(l,r,s,mid,p<<1),mmax);
if(r>mid)
mmax=max(getsum(l,r,mid+1,t,p<<1|1),mmax);
return mmax;
}
int main(){
int n,m,b,c;
char a;
while(scanf("%d %d",&n,&m)!=EOF)
{
bulid(1,1,n);
getchar();
while(m--)
{
scanf("%c %d %d",&a,&b,&c);
getchar();
if(a=='Q')
printf("%d\n",getsum(b,c,1,n,1));
else
update(b,c,1,n,1);
}
}
return 0;
}