func_code_string: #include <bits/stdc++.h>   using namespace std;   const int INF = 1 << 30;   const int N = 200111;   struct node {     int i, j;     long long mn, ad = 0;     node *l, *r;     node(long long *a, int i, int j) : i(i), j(j) {       if (j - i == 1) {         l = r = NULL;         mn = a[i];       } else {         int k = i + j >> 1;         l = new node(a, i, k);         r = new node(a, k, j);         combine();       }     }     inline void combine() { mn = min(l->mn, r->mn); }     void visit() {       if (ad) {         mn += ad;         if (l) l->ad += ad, r->ad += ad;         ad = 0;       }     }     void inc(int I, int J, long long a) {       if (I <= i && j <= J) {         ad += a;         visit();       } else {         visit();         if (!(J <= i || j <= I)) {           l->inc(I, J, a);           r->inc(I, J, a);           combine();         }       }     }     int find() {       visit();       if (mn > 0) return INF;       if (!l) {         return mn == 0 ? i : INF;       } else {         int ans = INF;         if (ans >= INF) ans = l->find();         if (ans >= INF) ans = r->find();         return ans;       }     }   };   long long a[N], s[N];   int main() {     int n, q;     scanf( %d%d , &n, &q);     for (int i = 0; i < n; i++) {       scanf( %lld , &a[i]);       s[i + 1] = s[i] + a[i];     }     for (int i = 0; i < n; i++) {       s[i] -= a[i];     }     node *t = new node(s, 0, n);     while (q--) {       int i;       long long v;       scanf( %d%lld , &i, &v);       long long d = v - a[--i];       t->inc(i, i + 1, -d);       t->inc(i + 1, n, +d);       t->visit();       a[i] += d;       int ans = t->find();       printf( %d n , ans >= INF ? -1 : ans + 1);     }   }   