func_code_string: #include <bits/stdc++.h>   using namespace std;   long long a[1000010];   long long l[1000010], r[1000010];   vector<pair<int, int>> g1[1000010], g2[1000010];   int n, q;   long long ans[1000010];   const int N = 1000000;   long long sum[N * 4];   long long flag[N * 4];   int cnt_v;   void build(int n) {     cnt_v = 1;     while (cnt_v <= n) {       cnt_v <<= 1;     }     memset(sum, 0, sizeof(sum));     memset(flag, 0, sizeof(flag));   }   void push_down(int t, long long l, long long r) {     if (flag[t]) {       long long mid = (l + r) >> 1;       sum[t << 1] += flag[t] * (mid - l + 1);       sum[(t << 1) + 1] += flag[t] * (r - mid);       flag[t << 1] += flag[t];       flag[(t << 1) + 1] += flag[t];       flag[t] = 0;     }   }   void push_up(int t) { sum[t] = sum[t << 1] + sum[(t << 1) + 1]; }   void upd(int x, int lx, int rx, int l, int r) {     if (lx > rx) return;     if (l > rx || r < lx) return;     if (lx >= l && rx <= r) {       sum[x] += (rx - lx + 1);       flag[x]++;       return;     }     {       push_down(x, lx, rx);       upd(x * 2, lx, (lx + rx) / 2, l, r);       upd(x * 2 + 1, (lx + rx) / 2 + 1, rx, l, r);       push_up(x);     }   }   long long get(int x, int lx, int rx, int l, int r) {     if (lx > rx) return 0;     if (l > rx || r < lx) return 0;     if (lx >= l && rx <= r) {       return sum[x];     } else {       push_down(x, lx, rx);       return get(x * 2, lx, (lx + rx) / 2, l, r) +              get(x * 2 + 1, (lx + rx) / 2 + 1, rx, l, r);     }   }   void init() { build(n); }   void upd(long long l, long long r, long long val) { upd(1, 1, cnt_v, l, r); }   long long get_sum(long long l, long long r) {     long long t = get(1, 0, cnt_v, l, r);     return t;   }   pair<int, int> st[1000040];   int main() {     scanf( %d%d , &n, &q);     for (int i = 1; i < n + 1; ++i) {       scanf( %lld , &a[i]);     }     for (int i = 0; i < q; ++i) {       scanf( %lld , &l[i]);     }     for (int i = 0; i < q; ++i) {       scanf( %lld , &r[i]);     }     for (int i = 0; i < q; ++i) {       g1[l[i]].push_back(make_pair(r[i], i));       g2[r[i]].push_back(make_pair(l[i], i));     }     init();     stack<pair<long long, int>> st;     st.push(make_pair(10000000, 0));     for (int i = 1; i < n + 1; ++i) {       while (!st.empty() && a[i] > st.top().first) {         st.pop();       }       long long s = st.top().second + 1;       long long e = i;       upd(s, e, 1);       st.push(make_pair(a[i], i));       for (int j = 0; j < g2[i].size(); ++j) {         long long s = g2[i][j].first;         int id = g2[i][j].second;         ans[id] += get_sum(s, i);       }     }     init();     while (!st.empty()) st.pop();     st.push(make_pair(10000000, n + 1));     for (int i = n; i > 0; --i) {       while (!st.empty() && a[i] > st.top().first) {         st.pop();       }       long long s = i;       long long e = st.top().second - 1;       upd(s, e, 1);       st.push(make_pair(a[i], i));       for (int j = 0; j < g1[i].size(); ++j) {         long long e = g1[i][j].first;         int id = g1[i][j].second;         ans[id] += get_sum(i, e);       }     }     for (int i = 0; i < q; ++i) {       printf( %lld  , ans[i] - (r[i] - l[i] + 1));     }     cout << endl;   }   