func_code_string: #include <bits/stdc++.h>   #pragma comment(linker,  /STACK:102400000,102400000 )   using namespace std;   void makedata() {     freopen( input.txt ,  w , stdout);     fclose(stdout);   }   long long a[250000];   int n, q;   template <typename T>   class SegmentTree {    private:     T *data, *lazy;     int type;     void pushup(int rt) {       if (type == 0)         data[rt] = data[rt << 1] + data[rt << 1 | 1];       else if (type == 1)         data[rt] = max(data[rt << 1], data[rt << 1 | 1]);     }     void pushdown(int rt, T m) {       if (lazy[rt] == 0) return;       lazy[rt << 1] += lazy[rt];       lazy[rt << 1 | 1] += lazy[rt];       if (type == 0) {         data[rt << 1] += (m - (m >> 1)) * lazy[rt];         data[rt << 1 | 1] += (m >> 1) * lazy[rt];       } else if (type == 1) {         data[rt << 1] += lazy[rt];         data[rt << 1 | 1] += lazy[rt];       }       lazy[rt] = 0;     }       public:     SegmentTree(int n, int t)         : data((T *)malloc((n << 3) * sizeof(T))),           lazy((T *)malloc((n << 3) * sizeof(T))),           type(t) {}     void Build(T *base, int l, int r, int rt) {       lazy[rt] = 0;       if (l == r)         data[rt] = base[l];       else {         int mid = (l + r) >> 1;         Build(base, l, mid, rt << 1);         Build(base, mid + 1, r, rt << 1 | 1);         pushup(rt);       }     }     void Modify(int l, int r, int rt, int L, int R, T v) {       if (L <= l && R >= r) {         lazy[rt] += v;         if (type == 0)           data[rt] += v * (r - l + 1);         else if (type == 1)           data[rt] += v;         return;       }       pushdown(rt, r - l + 1);       int mid = (l + r) >> 1;       if (L <= mid) Modify(l, mid, rt << 1, L, R, v);       if (R > mid) Modify(mid + 1, r, rt << 1 | 1, L, R, v);       pushup(rt);     }     T QueryPoint(int l, int r, int rt, int val) {       if (l == r) return data[rt];       pushdown(rt, r - l + 1);       int mid = (l + r) >> 1;       T ret = 0;       if (val <= mid)         ret = QueryPoint(l, mid, rt << 1, val);       else         ret = QueryPoint(mid + 1, r, rt << 1 | 1, val);       pushup(rt);       return ret;     }     T QuerySegment(int l, int r, int rt, int L, int R) {       pushdown(rt, r - l + 1);       if (L == l && R == r) return data[rt];       int mid = (l + r) >> 1;       if (R <= mid) return QuerySegment(l, mid, rt << 1, L, R);       if (mid < L) return QuerySegment(mid + 1, r, rt << 1 | 1, L, R);       if (type == 0)         return QuerySegment(l, mid, rt << 1, L, mid) +                QuerySegment(mid + 1, r, rt << 1 | 1, mid + 1, R);       else if (type == 1)         return max(QuerySegment(l, mid, rt << 1, L, mid),                    QuerySegment(mid + 1, r, rt << 1 | 1, mid + 1, R));     }     int find(int l, int r, int rt, int p, T x) {       if (r <= p) return -1;       if (data[rt] < x) return -1;       if (l == r) return l;       int mid = (l + r) >> 1;       if (l > p) {         if (data[rt << 1] >= x)           return find(l, mid, rt << 1, p, x);         else           return find(mid + 1, r, rt << 1 | 1, p, x);       }       int rtn = find(l, mid, rt << 1, p, x);       if (rtn != -1) return rtn;       return find(mid + 1, r, rt << 1 | 1, p, x);     }   };   SegmentTree<long long> Tsum(250000, 0), Tmax(250000, 1);   int main() {     std::ios::sync_with_stdio(0), cin.tie(0);     cin >> n >> q;     for (int i = 1; i <= n; i++) cin >> a[i];     Tsum.Build(a, 1, n, 1);     Tmax.Build(a, 1, n, 1);     while (q--) {       int p;       long long x;       cin >> p >> x;       Tsum.Modify(1, n, 1, p, p, x - a[p]);       Tmax.Modify(1, n, 1, p, p, x - a[p]);       a[p] = x;       if (a[1] == 0) {         cout << 1 << endl;         continue;       }       int m = 1;       while (1) {         long long sum = Tsum.QuerySegment(1, n, 1, 1, m);         int nex = Tmax.find(1, n, 1, m, sum);         if (nex == -1) {           cout << -1 << endl;           break;         }         if (a[nex] == Tsum.QuerySegment(1, n, 1, 1, nex - 1)) {           cout << nex << endl;           break;         }         m = nex;       }     }     return 0;   }   