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;
}