版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zz_ylolita/article/details/51983031
水一发线段树,顺便复习(骗经验)...宝宝还是想好好走下去^ ^
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
#define N 50010
int n,q,x,y,m1,m2;
int a[N];
struct node{
int l,r,m1,m2,num;
}tr[N*4];
void updata(int p)
{
if (!p) return ;
tr[p].m1=max(tr[p<<1].m1, tr[p<<1|1].m1);
tr[p].m2=min(tr[p<<1].m2, tr[p<<1|1].m2);
}
void build(int p,int l,int r)
{
tr[p].l=l;tr[p].r=r;
if (l==r) {tr[p].m1=tr[p].m2=tr[p].num=a[l];return ;}
int mid=(l + r) >> 1;
build(p<<1, l, mid);
build(p<<1|1, mid+1, r);
updata(p);
}
int ask_max(int p,int l,int r)
{
if (tr[p].l==l && tr[p].r==r)
return tr[p].m1;
int mid=(tr[p].l + tr[p].r) >> 1;
if (r<=mid) return ask_max(p<<1, l, r);
if (l>mid) return ask_max(p<<1|1, l, r);
if (l<=mid && r>mid)
{
int s1=ask_max(p<<1, l, mid);
int s2=ask_max(p<<1|1, mid+1, r);
return max(s1,s2);
}
}
int ask_min(int p, int l, int r)
{
if (tr[p].l==l && tr[p].r==r)
return tr[p].m2;
int mid=(tr[p].l+tr[p].r) >> 1;
if (r<=mid) return ask_min(p<<1, l, r);
if (l>mid) return ask_min(p<<1|1, l, r);
if (l<=mid && r>mid)
{
int s1=ask_min(p<<1, l, mid);
int s2=ask_min(p<<1|1, mid+1, r);
return min(s1,s2);
}
}
int main()
{
scanf("%d%d", &n, &q);
for (int i=1;i<=n;i++) scanf("%d", &a[i]);
build(1,1,n);
while (q--)
{
scanf("%d%d", &x, &y);
m1=ask_max(1,x,y);
m2=ask_min(1,x,y);
printf("%d\n", m1-m2);
}
}