func_code_string: #include <bits/stdc++.h>   long long int segMax[1000010] = {0}, segSum[1000010] = {0};   long long int a[200010];   void constructMax(int low, int high, int pos) {     if (low > high) return;     if (low == high) {       segMax[pos] = a[low];       return;     }     int mid = low + (high - low) / 2;     constructMax(low, mid, pos * 2 + 1);     constructMax(mid + 1, high, pos * 2 + 2);     segMax[pos] = std::max(segMax[pos * 2 + 1], segMax[pos * 2 + 2]);   }   void updateMax(int low, int high, int node, long long int val, int pos) {     if (low == high && low == node) {       segMax[pos] = val;       return;     }     if (high < node || low > node) return;     int mid = low + (high - low) / 2;     updateMax(low, mid, node, val, pos * 2 + 1);     updateMax(mid + 1, high, node, val, pos * 2 + 2);     segMax[pos] = std::max(segMax[pos * 2 + 1], segMax[pos * 2 + 2]);   }   void constructSum(int low, int high, int pos) {     if (low > high) return;     if (low == high) {       segSum[pos] = a[low];       return;     }     int mid = low + (high - low) / 2;     constructSum(low, mid, pos * 2 + 1);     constructSum(mid + 1, high, pos * 2 + 2);     segSum[pos] = segSum[pos * 2 + 1] + segSum[pos * 2 + 2];   }   void updateSum(int low, int high, int node, long long int val, int pos) {     if (low == high && low == node) {       a[low] = val;       segSum[pos] = val;       return;     }     if (low > node || high < node) return;     int mid = low + (high - low) / 2;     updateSum(low, mid, node, val, pos * 2 + 1);     updateSum(mid + 1, high, node, val, pos * 2 + 2);     segSum[pos] = segSum[pos * 2 + 1] + segSum[pos * 2 + 2];   }   int findMax(int low, int high, int sumToFind, int pos) {     if (low == high && segMax[pos] >= sumToFind) {       return low;     } else if (low == high) {       return -1;     }     int mid = low + (high - low) / 2;     if (segMax[pos * 2 + 1] >= sumToFind) {       return findMax(low, mid, sumToFind, pos * 2 + 1);     } else if (segMax[pos * 2 + 2] >= sumToFind) {       return findMax(mid + 1, high, sumToFind, pos * 2 + 2);     } else {       return -1;     }   }   long long int findSum(int qlow, int qhigh, int low, int high, int pos) {     if (high < qlow || low > qhigh) return 0;     if (qlow > qhigh)       return 0;     else if (qlow <= low && high <= qhigh) {       return segSum[pos];     }     int mid = low + (high - low) / 2;     return findSum(qlow, qhigh, low, mid, pos * 2 + 1) +            findSum(qlow, qhigh, mid + 1, high, pos * 2 + 2);   }   int main() {     std::ios_base::sync_with_stdio(0);     std::cin.tie(0);     int n, q;     std::cin >> n >> q;     for (int i = 0; i < n; ++i) {       std::cin >> a[i];     }     constructMax(1, n - 1, 0);     constructSum(1, n - 1, 0);     while (q--) {       int node;       long long int val;       std::cin >> node >> val;       --node;       if (node != 0) {         updateMax(1, n - 1, node, val, 0);         updateSum(1, n - 1, node, val, 0);       } else {         a[node] = val;       }       if (a[0] == 0) {         std::cout <<  1 n ;         continue;       }       long long int curSum = a[0];       bool flag = false;       while (curSum <= 1e9) {         int node = findMax(1, n - 1, curSum, 0);         long long int nowSum;         if (node == -1)           break;         else {           nowSum = findSum(1, node - 1, 1, n - 1, 0);           nowSum += a[0];         }         if (nowSum == a[node]) {           std::cout << node + 1 <<   n ;           flag = true;           break;         } else {           curSum = nowSum + a[node];         }       }       if (!flag) {         std::cout <<  -1 n ;       }     }   }   