func_code_string: #include <bits/stdc++.h>   using namespace std;   long long X[200200];   int Xi[200200], xi;   int X2[200200], x2;   int Xm[200200], xm;   int a[200200], w[200200], x, n, q;   inline void update(int u) {     for (; u <= n; u += u & -u) {       X[u] += x;       Xi[u] = (Xi[u] + xi) % 1000000007;       X2[u] = (X2[u] + x2) % 1000000007;       Xm[u] = (Xm[u] + xm) % 1000000007;     }   }   inline long long calc_x(int u, long long ans = 0) {     for (; u; u -= u & -u) ans += X[u];     return ans;   }   inline void calc(int u) {     x = 0, xi = 0, x2 = 0, xm = 0;     for (; u; u -= u & -u) {       x = (x + X[u]) % 1000000007;       xi = (xi + Xi[u]) % 1000000007;       x2 = (x2 + X2[u]) % 1000000007;       xm = (xm + Xm[u]) % 1000000007;     }   }   int collect(int u, int L, int R) {     calc(L - 1);     int tx = x, txi = xi, tx2 = x2, txm = xm;     calc(u - 1);     tx = (x - tx + 1000000007) % 1000000007,     txi = (xi - txi + 1000000007) % 1000000007,     tx2 = (x2 - tx2 + 1000000007) % 1000000007,     txm = (xm - txm + 1000000007) % 1000000007;     long long ans = 0;     if (L < u) {       ans += (long long)a[u] * tx;       ans -= txm;       ans += txi - (long long)u * tx;     }     tx = (x + w[u]) % 1000000007, txi = (xi + (long long)u * w[u]) % 1000000007,     tx2 = (x2 + (long long)w[u] * w[u]) % 1000000007,     txm = (xm + (long long)a[u] * w[u]) % 1000000007;     calc(R);     tx = (x - tx + 1000000007) % 1000000007,     txi = (xi - txi + 1000000007) % 1000000007,     tx2 = (x2 - tx2 + 1000000007) % 1000000007,     txm = (xm - txm + 1000000007) % 1000000007;     if (u < R) {       ans += txm;       ans -= (long long)a[u] * tx;       ans += (long long)u * tx - txi;     }     ans %= 1000000007;     if (ans < 0) ans += 1000000007;     return ans;   }   int main() {     scanf( %d %d , &n, &q);     for (int i = 1; i <= n; i++) scanf( %d , a + i);     for (int i = 1; i <= n; i++) {       scanf( %d , w + i);       x = w[i];       xi = (long long)i * x % 1000000007;       x2 = (long long)x * x % 1000000007;       xm = (long long)a[i] * x % 1000000007;       update(i);     }     while (q--) {       int L, R;       scanf( %d %d , &L, &R);       if (L < 0) {         L = -L;         x = -w[L];         xi = 1000000007 - (long long)L * w[L] % 1000000007;         x2 = 1000000007 - (long long)w[L] * w[L] % 1000000007;         xm = 1000000007 - (long long)a[L] * w[L] % 1000000007;         update(L);         w[L] = R;         x = w[L];         xi = (long long)L * x % 1000000007;         x2 = (long long)x * x % 1000000007;         xm = (long long)a[L] * x % 1000000007;         update(L);       } else if (L == R)         puts( 0 );       else {         long long L_ = calc_x(L - 1), all = calc_x(R) - L_;         int st = L - 1, ed = R;         while (st + 1 < ed) {           int md = st + ed >> 1;           long long sa = calc_x(md) - L_, sb = all - sa;           if (sa > sb)             ed = md;           else             st = md;         }         printf( %d n , collect(ed, L, R));       }     }   }   