今天爲大家帶來的仍然是線段樹的題,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;
}