#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool cmax(T& x, T y) {
  return y > x ? x = y, true : false;
}
template <typename T>
inline bool cmin(T& x, T y) {
  return y < x ? x = y, true : false;
}
template <typename T>
inline T dmax(T x, T y) {
  return x > y ? x : y;
}
template <typename T>
inline T dmin(T x, T y) {
  return x < y ? x : y;
}
const int MAXN = 2e5 + 5;
const long long oo = 2e18;
struct Query {
  int le, ri, o;
  inline Query(int le = 0, int ri = 0, int o = 0) : le(le), ri(ri), o(o) {}
  inline bool operator<(const Query& w) const { return le < w.le; }
} qry[MAXN];
int N, Q, a[MAXN];
long long ans[MAXN];
struct tree {
  int mn, cnt, tag, upd;
  long long sum;
} t[MAXN << 2];
inline void rel(int k) {
  t[k].mn = dmin(t[k << 1].mn, t[k << 1 | 1].mn);
  t[k].sum = t[k << 1].sum + t[k << 1 | 1].sum;
  t[k].cnt = 0;
  if (t[k << 1].mn == t[k].mn) t[k].cnt += t[k << 1].cnt;
  if (t[k << 1 | 1].mn == t[k].mn) t[k].cnt += t[k << 1 | 1].cnt;
}
void cg(int k, int tag, int upd) {
  if (tag != 0) {
    t[k].mn += tag;
    t[k].tag += tag;
  }
  if (t[k].mn == t[k >> 1].mn || t[k].mn == 0) {
    t[k].sum += (long long)t[k].cnt * upd;
    t[k].upd += upd;
  }
}
void Pushdown(int k) {
  cg(k << 1, t[k].tag, t[k].upd);
  cg(k << 1 | 1, t[k].tag, t[k].upd);
  t[k].tag = t[k].upd = 0;
}
void Build(int le, int ri, int k) {
  if (le == ri) {
    t[k].mn = 1;
    t[k].cnt = 1;
    return;
  }
  int mi = (le + ri) >> 1;
  Build(le, mi, k << 1);
  Build(mi + 1, ri, k << 1 | 1);
  rel(k);
}
void cg(int le, int ri, int k, int L, int R, int tag, int upd) {
  if (le != ri) Pushdown(k);
  if (L <= le && ri <= R) return cg(k, tag, upd);
  int mi = (le + ri) >> 1;
  if (L <= mi) cg(le, mi, k << 1, L, R, tag, upd);
  if (mi + 1 <= R) cg(mi + 1, ri, k << 1 | 1, L, R, tag, upd);
  rel(k);
}
long long get(int le, int ri, int k, int L, int R) {
  if (le != ri) Pushdown(k);
  if (L <= le && ri <= R) return t[k].sum;
  int mi = (le + ri) >> 1;
  long long sum = 0;
  if (L <= mi) sum += get(le, mi, k << 1, L, R);
  if (mi + 1 <= R) sum += get(mi + 1, ri, k << 1 | 1, L, R);
  return sum;
}
deque<int> q_mx, q_mn;
int main() {
  scanf("%d", &N);
  for (int i = 1; i <= N; i++) scanf("%d", &a[i]);
  scanf("%d", &Q);
  for (int i = 1; i <= Q; i++) {
    int le, ri;
    scanf("%d%d", &le, &ri);
    qry[i] = Query(le, ri, i);
  }
  sort(qry + 1, qry + Q + 1);
  Build(1, N, 1);
  int o = N + 1;
  for (int i = Q; i >= 1; i--) {
    while (qry[i].le < o) {
      o--;
      while (!q_mx.empty() && a[o] > a[q_mx.back()]) {
        int cl = q_mx.back(), cr;
        q_mx.pop_back();
        cr = q_mx.empty() ? N : (q_mx.back() - 1);
        cg(1, N, 1, cl, cr, a[o] - a[cl], 0);
      }
      while (!q_mn.empty() && a[o] < a[q_mn.back()]) {
        int cl = q_mn.back(), cr;
        q_mn.pop_back();
        cr = q_mn.empty() ? N : (q_mn.back() - 1);
        cg(1, N, 1, cl, cr, a[cl] - a[o], 0);
      }
      cg(1, N, 1, o, N, -1, 0);
      cg(1, N, 1, o, N, 0, 1);
      q_mx.push_back(o);
      q_mn.push_back(o);
    }
    ans[qry[i].o] = get(1, N, 1, qry[i].le, qry[i].ri);
  }
  for (int i = 1; i <= Q; i++) printf("%lld\n", ans[i]);
  return 0;
}
