func_code_string: #include <bits/stdc++.h>   using namespace std;   multiset<int> s;   multiset<int>::iterator itr;   int c[5], tot;   int get_ty(int x) {     if (c[2] >= x)       return 1;     else if (c[1] + c[2] >= x)       return 2;     else if (c[0] + c[1] + c[2] >= x)       return 3;     else       return 4;   }   int main() {     int n;     scanf( %d , &n);     for (int i = 0; i < 3; i++) scanf( %d , &c[i]);     for (int i = 0; i < 3; i++) tot += c[i];     sort(c, c + 3);     for (int i = 0; i < n; i++) {       int t;       scanf( %d , &t);       s.insert(t);     }     int res = 0;     bool isok = 0, flag = 0;     while (!s.empty()) {       int mm = *(--s.end());       if (!flag) {         int ty = get_ty(mm);         if (ty == 4) break;         if (ty == 3)           s.erase(--s.end());         else if (ty == 2) {           s.erase(--s.end());           int loc = 0;           for (int i = 0; i < 3; i++)             if (tot - c[i] >= mm) loc = i;           itr = s.upper_bound(c[loc]);           if (itr != s.begin()) s.erase(--itr);         } else if (ty == 1)           flag = 1;       }       if (flag) {         int loc = 0;         for (int i = 2; i >= 0; i--)           if (c[i] >= mm) loc = i;         s.erase(--s.end());         itr = s.upper_bound(c[loc == 0]);         bool dbk = 1;         if (itr == s.begin())           dbk = 0;         else {           int tt = *(--itr);           s.erase(itr);           itr = s.upper_bound(c[1 + (loc <= 1)]);           if (itr == s.begin()) {             s.insert(tt);             dbk = 0;           }         }         if (dbk)           s.erase(--itr);         else {           itr = s.upper_bound(tot - c[loc]);           if (itr != s.begin()) s.erase(--itr);         }       }       isok = 1;       res++;     }     if (!isok)       printf( -1 n );     else       printf( %d n , res);     return 0;   }   