思路:又是一道经典的线段树 比前面的两道要简单,没有更新操作
//2416K
1579MS
#include <stdio.h>
#define M 50005
struct data
{
l,r;
tall,shor;
}line[3*M];
int num[M];
int min (int a,int b)
{
> b?b:a;
}
int max (int a,int b)
{
> b?a:b;
}
int low,hei;
void BuildTree(int left,int right,int u)
{
left;
right;
(line[u].l == line[u].r)
line[u].tall = num[left];
line[u].shor = num[left];
return ;
(line[u].l+line[u].r)/2;
BuildTree(left,mid,2*u);
BuildTree(mid+1,right,2*u+1);
= max (line[2*u].tall,line[2*u+1].tall);
= min (line[2*u].shor,line[2*u+1].shor);
}
void query (int left,int right,int u)
{
(line[u].l == left&&line[u].r ==
right)
low = min (low,line[u].shor);
hei = max (hei,line[u].tall);
return ;
(line[u].l + line[u].r)/2;
<= mid)
query (left,right,2*u);
(left >= mid + 1)
query (left,right,2*u+1);
query(left,mid,2*u);
query (mid+1,right,2*u+1);
}
int main ()
{
n,m,a,b;
("%d%d",&n,&m);
1;i <= n;i ++)
scanf ("%d",&num[i]);
BuildTree(1,n,1);
--)
scanf ("%d%d",&a,&b);
low = 1000001;
hei = 0;
query (a,b,1);
printf ("%d\n",hei - low);
0;
}