题意:给你一组值,然后询问某个区间的最大值和最小值得差
分析:因为没有更新,所以只需要查找即可,节点保存一个最大值最小值就行了
#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));
}
}
}