G - Balanced Lineup (区间最大值和最小值的差)

题意:给你一组值,然后询问某个区间的最大值和最小值得差

分析:因为没有更新,所以只需要查找即可,节点保存一个最大值最小值就行了

#include<cstdio>
#include<iostream>
#include<cstring> 
#include<algorithm>
#include<string>
#include<cmath>
#include<stdlib.h>
#include<queue>
#include<vector>
#include<assert.h>
#include<map>
#include<set>
#include<stack>
#define in(a) scanf("%d",&a)
#define ind(a) scanf("%lld",&a)
#define inc(a) scanf("%c",&a)
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII; 
const ll mod=1000000007;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); 
for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int maxnn=5e4+10;
struct node
{
	int l,r;
	int maxx,minn;
}a[4*maxnn];
void pushup(int id)
{
	a[id].maxx=max(a[id<<1].maxx,a[id<<1|1].maxx);
	a[id].minn=min(a[id<<1|1].minn,a[id<<1].minn);
}
void build(int id,int l,int r)
{
	a[id].l=l;a[id].r=r;a[id].maxx=a[id].minn=0;
	if(l==r) 
	{
		scanf("%d",&a[id].maxx);
		a[id].minn=a[id].maxx;
		return ;
	}
	int mid=(l+r)>>1;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
	pushup(id);
}
int query(int id,int l,int r,int val)
{
	if(a[id].l==l&&a[id].r==r)
	{
		if(val==1) return a[id].maxx;
		else return a[id].minn;
	}
	int mid=(a[id].l+a[id].r)>>1;
	if(r<=mid) return query(id<<1,l,r,val);
	else if(l>mid) return query(id<<1|1,l,r,val);
	else
	{
		if(val==1) return max(query(id<<1,l,mid,val),query(id<<1|1,mid+1,r,val));
		else return min(query(id<<1|1,mid+1,r,val),query(id<<1,l,mid,val));
	}
}
int main()
{
	int n,q;
	while(~scanf("%d%d",&n,&q))
	{
		build(1,1,n);
		int x,y;
		rep(i,0,q)
		{
			scanf("%d%d",&x,&y);
			printf("%d\n",query(1,x,y,1)-query(1,x,y,2));
		}
		
	}
} 

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/85947138