func_code_string: #include <bits/stdc++.h>   #pragma GCC optimize( O3 )   using namespace std;   enum { MOD0 = 1000000000, MOD7 = 1000000007, MOD9 = 1000000009 };   template <typename T>   class FenwickTree {     vector<T> tree;       public:     FenwickTree<T>() : tree() {}     FenwickTree<T>(vector<T> a) : tree(a.size() + 1, 0) {       for (size_t i = 0; i < a.size(); ++i) {         add(i, a[i]);       }     }     size_t size() const { return tree.size() ? tree.size() - 1 : 0; }     void add(size_t index, T value) {       for (; ++index <= size(); index |= index - 1) {         tree[index] += value;       }     }     T sum(size_t right) {       T ret{};       for (; right; right &= right - 1) {         ret += tree[right];       }       return ret;     }     T sum(size_t left, size_t right) { return sum(right) - sum(left); }   };   int a[200000];   FenwickTree<long long> ft;   int t[800000];   int n;   void build(int x = 0, int L = 0, int R = n - 1) {     if (L == R) {       t[x] = a[L];       return;     }     int M = (L + R) / 2;     build(2 * x + 1, L, M);     build(2 * x + 2, M + 1, R);     t[x] = max(t[2 * x + 1], t[2 * x + 2]);   }   void upd(int index, int val, int x = 0, int L = 0, int R = n - 1) {     if (L == R) {       t[x] = val;       return;     }     int M = (L + R) / 2;     if (index <= M) {       upd(index, val, 2 * x + 1, L, M);     } else {       upd(index, val, 2 * x + 2, M + 1, R);     }     t[x] = max(t[2 * x + 1], t[2 * x + 2]);   }   int get(long long val, int from, int x = 0, int L = 0, int R = n - 1) {     if (t[x] < val || R < from) {       return n;     } else if (L == R) {       return L;     }     int M = (L + R) / 2;     if (M < from) {       return get(val, from, 2 * x + 2, M + 1, R);     } else if (t[2 * x + 1] >= val) {       int s = get(val, from, 2 * x + 1, L, M);       if (s < n) {         return s;       }     }     return get(val, from, 2 * x + 2, M + 1, R);   }   int get_ans() {     long long cur = 0;     int index = 0;     if (a[0] == 0) {       return 1;     }     while (index < n) {       cur += a[index];       index = get(cur, index + 1);       cur = ft.sum(index);       if (a[index] == cur) {         break;       }     }     return index >= n ? -1 : index + 1;   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(nullptr);     int q;     cin >> n >> q;     vector<long long> b;     for (int i = 0; i < n; ++i) {       cin >> a[i];       b.push_back(a[i]);     }     ft = FenwickTree<long long>(b);     build();     while (q--) {       int p, x;       cin >> p >> x;       --p;       ft.add(p, x - a[p]);       a[p] = x;       upd(p, x);       cout << get_ans() <<   n ;     }     return 0;   }   