func_code_string: #include <bits/stdc++.h>   using namespace std;   long long int power(long long int x, long long int y, long long int p) {     long long int res = 1;     x = x % p;     while (y > 0) {       if (y & 1) res = (res * x) % p;       y = y >> 1;       x = (x * x) % p;     }     return res;   }   long long int fact[2 * 100005];   long long int func() {     fact[0] = fact[1] = 1;     for (long long int i = 2; i < 200001; i++) {       fact[i] = (fact[i - 1] * i) % 1000000007;     }     return 0;   }   set<pair<int, int> > m;   set<int> k;   set<pair<int, int> > h;   int arr[100005], pp[100005];   int main() {     int n;     cin >> n;     for (int i = 0; i < n; i++) {       int x;       cin >> x;       if (x == 1) {         k.insert(i + 1);       } else {         h.insert(make_pair(x, i + 1));       }       arr[i + 1] = x;       pp[i + 1] = x;     }     set<int>::iterator it;     set<pair<int, int> >::iterator ii, iii;     set<pair<int, int> > ans;     int cnt = 0;     int mm = 0;     ii = h.begin();     iii = h.begin();     if (h.size() == 0) {       if (k.size() > 2) {         cout <<  NO ;         return 0;       }       cout <<  YES 1 n1 n1 2 ;       return 0;     }     for (ii = h.begin(); iii != h.end();) {       pair<int, int> p1 = *ii;       iii = ++ii;       if (iii == h.end()) break;       pair<int, int> p2 = *iii;       ans.insert(make_pair(p1.second, p2.second));       arr[p1.second]--;       arr[p2.second]--;       mm++;     }     if (k.size() && h.size()) {       pair<int, int> p = *(h.begin());       int x = *(k.begin());       ans.insert(make_pair(x, p.second));       arr[x]--;       arr[p.second]--;       k.erase(x);       mm++;     }     if (k.size() && h.size()) {       pair<int, int> p = *(--h.end());       int x = *(k.begin());       ans.insert(make_pair(x, p.second));       arr[x]--;       arr[p.second]--;       k.erase(x);       mm++;     }     for (int i = 1; i <= n; i++) {       if (arr[i] && k.find(i) == k.end()) m.insert(make_pair(arr[i], i));     }     int gg = 0;     for (it = k.begin(); it != k.end(); it++) {       if (arr[*it] == 0) continue;       m.erase(make_pair(arr[*it], *it));       if (m.size() == 0) break;       pair<int, int> p = *(m.rbegin());       ans.insert(make_pair(*it, p.second));       m.erase(make_pair(arr[p.second], p.second));       arr[p.second]--;       if (arr[p.second]) m.insert(make_pair(arr[p.second], p.second));     }     int sum = 0;     for (int i = 0; i < n; i++) {       sum += pp[i + 1];     }     if (sum < 2 * n - 2) {       cout <<  NO ;       return 0;     }     cout <<  YES   << mm << endl;     cout << ans.size() << endl;     for (set<pair<int, int> >::iterator i = ans.begin(); i != ans.end(); i++) {       cout << (*i).first <<     << (*i).second << endl;     }   }   