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;
} 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值