#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <algorithm>#include <cstdlib>//Accepted4868K3016MSC++2390B2013-08-09 12:45:26// Accepted5392K4844MSG++2390B2013-08-09 12:44:44using namespace std;const int maxn = 50100;const int INF = 0x7fffffff;struct Node { int Left, Right; int maxval, minxval; Node *LeftChild, *RightChild; Node() { maxval = -1;//保证插入时候更新不会出错。 minxval = INF; }};int ql, qr;//全局变量,即每次插入或查询区间。int Min, Max;//保存要查询区间的最值.int n, m;Node *root = NULL;void Build(Node* cur, int L, int R) { cur->Left = L; cur->Right = R; if(L != R) { cur->LeftChild = new Node; cur->RightChild = new Node; Build(cur->LeftChild, L, (L+R)/2); Build(cur->RightChild, (L+R)/2+1, R); } else {//L == R cur->LeftChild = NULL;//没有左右孩子。 cur->RightChild = NULL; }}//插入时候每次给ql赋值.void update(Node* cur, int L, int R, int value) { if(L==R && L == ql) { //叶子节点。 cur->maxval = value; cur->minxval = value; return; } Node* LC = cur->LeftChild; Node* RC = cur->RightChild; int M = (L+R)/2; if(ql <= M) update(LC, L, M, value); else update(RC, M+1, R, value); cur->maxval = max(LC->maxval, RC->maxval); cur->minxval = min(LC->minxval, RC->minxval);}//区间:[ql, qr], Min, Max 全局变量, 进行初始化。void query(Node* cur, int L, int R) { if(ql <= L && R <= qr) { Min = min(Min, cur->minxval); Max = max(Max, cur->maxval); return; } Node* LC = cur->LeftChild; Node* RC = cur->RightChild; int M = (L+R)/2; if(ql <= M) query(LC, L, M); if(qr > M) query(RC, M+1, R); return;}void init(){ int tmp; Max = -1;//littl, import; Min = 10000000;//big Build(root, 1, n); for(int i = 1; i <= n; i++) { scanf("%d", &tmp); ql = i; update(root, 1, n, tmp); }}int main(){ int start, endx; while(scanf("%d%d", &n, &m) != EOF) { root = new Node; init(); for(int i = 1; i <= m; i++) { scanf("%d%d", &start, &endx); ql = start, qr = endx; Max = -1, Min = INF; query(root, 1, n); int res = Max - Min; printf("%d\n", res); } } return 0;}