func_code_string: #include <bits/stdc++.h>   using namespace std;   using i64 = long long;   const int N = 2e5 + 5;   struct Nod {     i64 sum;     int max_pos, max_pos2;   };   Nod pom[N * 4];   int v[N];   int n, q, update_pos, update_val, current_pos;   i64 query_sum, peak_sum;   static void pom_build(int nod, int l, int r) {     if (l == r) {       pom[nod] = {v[l], l, n + 1};       return;     }     int med = (l + r) / 2;     pom_build(2 * nod, l, med);     pom_build(2 * nod + 1, med + 1, r);     pom[nod].sum = pom[2 * nod].sum + pom[2 * nod + 1].sum;     if (v[pom[2 * nod].max_pos] > v[pom[2 * nod + 1].max_pos]) {       pom[nod].max_pos = pom[2 * nod].max_pos;       pom[nod].max_pos2 = v[pom[2 * nod].max_pos2] > v[pom[2 * nod + 1].max_pos]                               ? pom[2 * n].max_pos2                               : pom[2 * nod + 1].max_pos;     } else {       pom[nod].max_pos = pom[2 * nod + 1].max_pos;       pom[nod].max_pos2 = pom[2 * nod + 1].max_pos2;     }   }   static void internal_update(int nod, int l, int r) {     if (l == r) {       pom[nod].sum = update_val;       return;     }     int med = (l + r) / 2;     if (update_pos <= med)       internal_update(2 * nod, l, med);     else       internal_update(2 * nod + 1, med + 1, r);     pom[nod].sum = pom[2 * nod].sum + pom[2 * nod + 1].sum;     if (v[pom[2 * nod].max_pos] > v[pom[2 * nod + 1].max_pos]) {       pom[nod].max_pos = pom[2 * nod].max_pos;       pom[nod].max_pos2 = v[pom[2 * nod].max_pos2] > v[pom[2 * nod + 1].max_pos]                               ? pom[2 * n].max_pos2                               : pom[2 * nod + 1].max_pos;     } else {       pom[nod].max_pos = pom[2 * nod + 1].max_pos;       pom[nod].max_pos2 = pom[2 * nod + 1].max_pos2;     }   }   static int find_peak(int nod, int l, int r) {     if (l == r) return l;     if (v[pom[1].max_pos] == 0) return n >= 2 ? 2 : -1;     int med = (l + r) / 2;     if (current_pos < med && (pom[2 * nod].max_pos != current_pos                                   ? v[pom[2 * nod].max_pos]                                   : v[pom[2 * nod].max_pos2]) >= query_sum)       return find_peak(2 * nod, l, med);     else if (current_pos < r &&              (pom[2 * nod + 1].max_pos != current_pos                   ? v[pom[2 * nod + 1].max_pos]                   : v[pom[2 * nod + 1].max_pos2]) >= query_sum) {       peak_sum += pom[2 * nod].sum;       return find_peak(2 * nod + 1, med + 1, r);     } else       return -1;   }   static void update(int pos, int val) {     update_val = val;     update_pos = pos;     v[pos] = val;     internal_update(1, 1, n);   }   static int query() {     int pos = 0;     peak_sum = 0;     query_sum = 0;     current_pos = 0;     while ((pos = find_peak(1, 1, n)) != -1) {       query_sum = peak_sum + v[pos];       if (peak_sum == v[pos]) return pos;       current_pos = pos;       peak_sum = 0;     }     return -1;   }   int main() {     ios::sync_with_stdio(false);     cin.tie(0), cout.tie(0);     int pos, val;     cin >> n >> q;     for (int i = 1; i <= n; ++i) cin >> v[i];     pom_build(1, 1, n);     while (q--) {       cin >> pos >> val;       update(pos, val);       cout << query() <<   n ;     }     return 0;   }   