func_code_string: #include <bits/stdc++.h>   using namespace std;   struct Point {     long long x, y;     Point() {}     Point(long long a, long long b) : x(a), y(b) {}     Point operator-(Point b) { return Point(x - b.x, y - b.y); }   };   long long cross(Point x, Point y) { return x.x * y.y - x.y * y.x; }   Point st[100005];   int top;   long long calc(Point x, long long k) { return x.x * k + x.y; }   void insert(Point p) {     while (top > 1 && cross(p - st[top], st[top] - st[top - 1]) >= 0) top--;     st[++top] = p;   }   int a[100005], b[100005], num[100005];   long long up[100005];   void convex(int n, int m, long long lb, long long rb) {     long long s = 0;     for (int i = 1; i <= n; i++) s += a[i];     top = 0;     for (int i = n; i >= 0; i--) {       insert(Point(n - i, s));       s -= a[i];     }     int r = 1;     for (int i = 1; i <= m; i++) {       while (r < top && calc(st[r + 1], m - i) <= calc(st[r], m - i)) r++;       up[i] = max(up[i], lb - calc(st[r], m - i));     }     s = 0;     for (int i = 1; i <= n; i++) s += b[i];     top = 0;     for (int i = n; i >= 0; i--) {       insert(Point(n - i, s));       s -= b[i];     }     r = 1;     for (int i = 1; i <= m; i++) {       while (r < top && calc(st[r + 1], m - i) <= calc(st[r], m - i)) r++;       up[i] = max(up[i], rb - calc(st[r], m - i));     }   }   bool solve1(int n, long long rb) {     long long s1 = 0, s2 = 0, maxn = 0;     int last2 = 0;     for (int i = 1; i <= n; i++)       if (num[i] != -1) {         if (maxn > num[i]) return 0;         s1 += num[i];         s2 += (long long)(i - last2 - 1) * (num[i] - maxn);         if (s1 < up[i]) {           if (s1 + s2 < up[i]) return 0;           s2 -= up[i] - s1;           s1 = up[i];         }         last2 = i;         maxn = num[i];       } else {         s1 += maxn;         if (s1 < up[i]) {           if (s1 + s2 >= up[i]) {             s2 -= up[i] - s1;             s1 = up[i];           } else {             long long v = up[i] - s1 - s2, t = (v + i - last2 - 1) / (i - last2);             maxn += t;             s1 = up[i];             s2 = t * (i - last2) - v;           }         }       }     return s1 <= rb && (s1 + s2 >= rb || num[n] != -1);   }   int solve2(int n, int k, long long rb) {     long long s1 = 0, s2 = 0, maxn = 0;     int last2 = 0;     for (int i = 1; i <= n - k; i++)       if (num[i] != -1) {         s1 += num[i];         s2 += (long long)(i - last2 - 1) * (num[i] - maxn);         if (s1 < up[i]) {           s2 -= up[i] - s1;           s1 = up[i];         }         last2 = i;         maxn = num[i];       } else {         s1 += maxn;         if (s1 < up[i]) {           if (s1 + s2 >= up[i]) {             s2 -= up[i] - s1;             s1 = up[i];           } else {             long long v = up[i] - s1 - s2, t = (v + i - last2 - 1) / (i - last2);             maxn += t;             s1 = up[i];             s2 = t * (i - last2) - v;           }         }       }     long long t = -1;     for (int i = n - k + 1; i <= n; i++)       if (num[i] != -1) {         if (t == -1)           t = num[i];         else if (t != num[i])           return -1;       }     if (t == -1) t = (rb - s1) / k;     long long v = rb - (long long)t * k;     if (s1 > v || maxn > t) return -1;     return (s1 + s2 + (long long)(n - k - last2) * (t - maxn) >= v) ? t : -1;   }   int main() {     memset(num, 255, sizeof(num));     int n, m;     scanf( %d%d , &n, &m);     long long lb = 0, s = 0;     for (int i = 1; i <= n; i++) {       scanf( %d%d , &a[i], &b[i]);       lb += a[i];       s += b[i];     }     sort(a + 1, a + n + 1);     sort(b + 1, b + n + 1);     int k;     scanf( %d , &k);     for (int i = 1; i <= k; i++) {       int x, y;       scanf( %d%d , &x, &y);       num[m - x + 1] = y;     }     long long rb = 0;     scanf( %lld , &rb);     if (lb > rb || s < rb) {       puts( -1 -1 );       return 0;     }     convex(n, m, lb, rb);     if (!solve1(m, rb)) {       puts( -1 -1 );       return 0;     }     int l = 1, r = m;     while (l < r) {       int mid = ((l + r) >> 1) + 1;       if (solve2(m, mid, rb) != -1)         l = mid;       else         r = mid - 1;     }     int ans = solve2(m, l, rb);     printf( %d %d n , l, ans);     return 0;   }   