I Hate It

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章