线段树好久没写了,拿来练练手
#include <iostream>
#include <map>
#include <set>
#include <algorithm>
#include <string>
#include <queue>
using namespace std;
const int maxn = 50005;
const int maxnode = maxn * 4;
int a[maxn], n, q;
int minv[maxnode], maxv[maxnode];
void init(int o, int l, int r)
{
if (l>r) return;
if (l==r){
maxv[o] = minv[o] = a[l];
//cout<<l<<" "<<r<<" "<<maxv[o]<<" "<<minv[o]<<endl;
return ;
}
int mid = (r+l)/2;
int lc = 2*o, rc = 2*o+1;
init( lc, l, mid );
init( rc, mid+1, r );
maxv[o] = max( maxv[lc], maxv[rc] );
minv[o] = min( minv[lc], minv[rc] );
//cout<<l<<" "<<r<<" "<<maxv[o]<<" "<<minv[o]<<endl;
}
int maxans, minans, x1, x2;
void query(int o, int l, int r)
{
if (l>r) return ;
if (x1<=l && x2>=r) {
maxans = max(maxv[o], maxans);
minans = min(minv[o], minans);
return;
}
int mid = (r+l)/2;
int lc = 2*o, rc = 2*o+1;
if (x1<=mid)
query(lc, l, mid);
if (x2>=mid+1)
query(rc, mid+1, r);
}
int main() {
for (int i=0; i<maxnode; i++)
minv[i] = 0xFFFFFFF;
memset(maxv, 0, sizeof(maxv));
scanf("%d %d", &n, &q);
for (int i=1; i<=n; i++)
scanf("%d", &a[i]);
init(1, 1, n);
for (int i=0; i<q; i++) {
cin>>x1>>x2;
minans = 0xFFFFFFF;
maxans = 0;
query(1, 1, n);
printf("%d\n",maxans-minans);
}
}