func_code_string: #include <bits/stdc++.h>   using namespace std;   vector<pair<int, int> > res;   int n;   int tx[1000000], add[1000000];   void up(int i, int l, int r, int a, int b, int x) {     if (b < l || a > r) return;     if (a <= l && b >= r) {       tx[i] += x;       add[i] += x;       return;     }     int m = (l + r) / 2;     up(2 * i, l, m, a, b, x);     up(2 * i + 1, m + 1, r, a, b, x);     tx[i] = min(tx[2 * i], tx[2 * i + 1]) + add[i];   }   int getmin(int i, int l, int r, int a, int b) {     if (b < l || a > r) return 1000000000;     if (a <= l && b >= r) return tx[i];     int m = (l + r) / 2;     return min(getmin(2 * i, l, m, a, b), getmin(2 * i + 1, m + 1, r, a, b)) +            add[i];   }   void com(int l, int r) {     if (l > r) return;     if (l == r) {       for (int i = 0; i < getmin(1, 1, n, l, l); i++)         res.push_back(make_pair(l, r));       return;     }     int m = getmin(1, 1, n, l, r);     if (m == 0) {       int mid = (l + r) / 2;       int left = l;       int right = r;       while (1) {         mid = (left + right) / 2;         if (getmin(1, 1, n, l, mid) == 0) {           if (getmin(1, 1, n, mid, mid) == 0) {             com(l, mid - 1);             com(mid + 1, r);             return;           } else             right = mid;         } else           left = mid + 1;       }     } else if (m > 0) {       up(1, 1, n, l, r, -m);       for (int i = 0; i < m; i++) res.push_back(make_pair(l, r));       com(l, r);     }   }   int main() {     int k;     scanf( %d , &n);     ;     for (int i = 0; i < n; i++) {       scanf( %d , &k);       ;       up(1, 1, n, i + 1, i + 1, k);     }     com(1, n);     cout << res.size() << endl;     for (int i = 0; i < res.size(); i++)       printf( %d %d n , res[i].first, res[i].second);     return 0;   }   