FAFU-1272 官渡 线段树成段更新

http://acm.fafu.edu.cn/problem.php?id=1272


#include "stdio.h"
const int maxn = 100050;
int data[maxn],n,q,max,min,x,y;

struct node
{
    int max,min;
	node()
	{
		max = -1<<30;
		min =  1<<30;
	}
}tree[maxn<<2+1];

int input()
{
    char ch;
    int sign = 1,ans = 0;
    while(ch = getchar(), ch == ' ' || ch == '\n');       //过滤多余字符
    ans = ch - '0';
    while(ch = getchar(), ch >= '0' && ch <= '9')
    {
        ans = ans * 10 + ch - '0';
    }
    return ans;
}

void pushup( int x )
{
	tree[x].max = tree[x*2].max > tree[x*2+1].max ?tree[x*2].max:tree[x*2+1].max;
	tree[x].min = tree[x*2].min < tree[x*2+1].min ?tree[x*2].min:tree[x*2+1].min;
}

void buildtree( int ld,int rd,int now )
{
	if( ld == rd )
	{
		tree[now].min = tree[now].max = data[ld];
		return;
	}
	int mid = ( ld+rd )>>1;
	buildtree( ld,mid,now*2);
	buildtree( mid+1,rd,now*2+1);
	pushup( now );
}

void query( int ld,int rd,int now )
{
	if( x <= ld && y >= rd )
	{
		max = tree[now].max > max ? tree[now].max : max;
        min = tree[now].min < min ? tree[now].min : min;
		return;
	}
	int mid = (ld+rd)>>1;
	if( x <= mid )
	{
		query( ld,mid,now*2 );
	}
	if( y > mid )
	{
		query( mid+1,rd,now*2+1 );
	}
}

int main()
{
    int i;
	scanf("%d%d",&n,&q);
	for( i=1;i<=n;i++ )
	{
		data[i] = input();
	}
	buildtree( 1,n,1 );    //建树
	while( q-- )
	{
		x = input();
		y = input();
		if( x>y )
		{
			int t = x;
			x = y;
			y = t;
		}
		max = -1<<30;
		min =  1<<30;
		query( 1,n,1 );
		printf ("%d\n",max - min);
	}
	return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值