func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 400005;   int n, q, a[maxn];   namespace SGT {   int Min[maxn << 2];   void modify(int l, int r, int id, int x, int y) {     if (l == r) {       Min[id] = y;       return;     }     int mid = (l + r) >> 1;     if (x <= mid)       modify(l, mid, id << 1, x, y);     else       modify(mid + 1, r, id << 1 | 1, x, y);     Min[id] = min(Min[id << 1], Min[id << 1 | 1]);   }   int query(int l, int r, int id, int L, int R) {     if (L <= l && r <= R) return Min[id];     int mid = (l + r) >> 1, res = 1e9;     if (L <= mid) res = min(res, query(l, mid, id << 1, L, R));     if (R > mid) res = min(res, query(mid + 1, r, id << 1 | 1, L, R));     return res;   }   }  // namespace SGT   struct query {     int r1, c1, c2, id;     query() {}     query(int _r1, int _c1, int _c2, int _i) {       r1 = _r1, c1 = _c1, c2 = _c2, id = _i;     }   };   int ans[maxn], now[maxn];   vector<query> Q[2][maxn];   void solve(vector<query> *Q) {     static int st[maxn], num[maxn], top;     top = 0;     for (int i = 1; i <= n; i++) {       while (top && num[top] >= a[i]) top--;       st[++top] = i;       num[top] = a[i];       SGT ::modify(1, n, 1, top, -2 * i + a[i]);       for (auto u : Q[i]) {         int r1 = u.r1, c1 = u.c1, r2 = i, c2 = u.c2, id = u.id;         int res = r2 - r1 + c2 + 1;         int L = lower_bound(st + 1, st + top + 1, r1) - st, R = top;         now[id] = min(c1, num[L]);         res = min(res, r2 - r1 + abs(c2 - now[id]));         int pos = lower_bound(num + L, num + R + 1, c2) - num;         if (pos <= R) res = min(res, r2 - r1 + 1 + abs(c2 - num[pos]));         if (pos > L)           res = min(res, r2 - r1 + 1 + abs(c2 - num[pos - 1]));         else {           assert(pos == L);           pos = upper_bound(num + 1, num + R + 1, c2) - num - 1;           if (pos && st[pos] <= r1)             res = min(res, r1 + r2 - 2 * st[pos] + (c1 < num[pos]) +                                abs(c2 - num[pos]));         }         if (pos + 1 < L) {           R = L - 1, L = pos + 1;           int mid = upper_bound(num + L, num + R + 1, c1) - num;           if (mid <= R)             res = min(res, r1 + r2 + 1 + SGT ::query(1, n, 1, mid, R) - c2);           if (L < mid)             res = min(res, r1 + r2 + SGT ::query(1, n, 1, L, mid - 1) - c2);         }         ans[id] = res;       }     }     top = 0;     for (int i = n; i >= 1; i--) {       while (top && num[top] >= a[i]) top--;       st[++top] = i;       num[top] = a[i];       SGT ::modify(1, n, 1, top, 2 * i + a[i]);       for (auto u : Q[i]) {         int r1 = u.r1, r2 = i, c2 = u.c2, id = u.id;         int pos = upper_bound(num + 1, num + top + 1, c2) - num - 1, res = 1e9;         if (pos)           res = -(r1 + r2) + 2 * st[pos] + (now[id] < num[pos]) +                 abs(c2 - num[pos]);         if (pos + 1 <= top) {           int L = pos + 1, R = top;           int mid = upper_bound(num + L, num + R + 1, now[id]) - num;           if (mid <= R)             res = min(res, -(r1 + r2) + 1 + SGT ::query(1, n, 1, mid, R) - c2);           if (L < mid)             res = min(res, -(r1 + r2) + SGT ::query(1, n, 1, L, mid - 1) - c2);         }         ans[id] = min(ans[id], res);       }     }   }   int main() {     scanf( %d , &n);     for (int i = 1; i <= n; i++) scanf( %d , &a[i]);     scanf( %d , &q);     for (int i = 1, r1, c1, r2, c2; i <= q; i++) {       scanf( %d%d%d%d , &r1, &c1, &r2, &c2);       if (r1 <= r2)         Q[0][r2].push_back(query(r1, c1, c2, i));       else         Q[1][n - r2 + 1].push_back(query(n - r1 + 1, c1, c2, i));     }     solve(Q[0]);     reverse(a + 1, a + n + 1);     solve(Q[1]);     for (int i = 1; i <= q; i++) printf( %d n , ans[i]);     return 0;   }   