#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200000;
const int INF = (long long)1e9 + 5;
const long long MOD = (long long)1e9 + 7;
int N;
long long pos[MAXN + 5], w[MAXN + 5];
struct Segment_tree {
  long long sum0[4 * MAXN + 5], sum1[4 * MAXN + 5], psum[4 * MAXN + 5];
  void update(int p, int l, int r, int idx) {
    if (l == p && r == p) {
      sum0[idx] = w[p];
      sum1[idx] = w[p] * p % MOD;
      psum[idx] = pos[p] * w[p] % MOD;
      return;
    }
    int m = (l + r) >> 1;
    if (p <= m)
      update(p, l, m, idx << 1);
    else
      update(p, m + 1, r, idx << 1 | 1);
    sum0[idx] = (sum0[idx << 1] + sum0[idx << 1 | 1]);
    sum1[idx] = (sum1[idx << 1] + sum1[idx << 1 | 1]) % MOD;
    psum[idx] = (psum[idx << 1] + psum[idx << 1 | 1]) % MOD;
  }
  long long RSQ(long long *tar, int ql, int qr, int l, int r, int idx,
                bool mod) {
    if (qr < l || r < ql) return 0;
    if (ql <= l && r <= qr) return tar[idx];
    int m = (l + r) >> 1;
    long long ans = RSQ(tar, ql, qr, l, m, idx << 1, mod) +
                    RSQ(tar, ql, qr, m + 1, r, idx << 1 | 1, mod);
    if (mod) ans %= MOD;
    return ans;
  }
  int search(long long x, int l, int r, int idx) {
    if (l == r) return l;
    int m = (l + r) >> 1;
    if (sum0[idx << 1] > x) return search(x, l, m, idx << 1);
    return search(x - sum0[idx << 1], m + 1, r, idx << 1 | 1);
  }
} tree;
long long query(int l, int r) {
  long long sum = tree.RSQ(tree.sum0, l, r, 0, N, 1, false);
  long long pref = tree.RSQ(tree.sum0, 0, l - 1, 0, N, 1, false);
  int tar = tree.search(pref + sum / 2, 0, N, 1);
  assert(l <= tar && tar <= r);
  long long lpsum = tree.RSQ(tree.psum, l, tar, 0, N, 1, 1),
            rpsum = tree.RSQ(tree.psum, tar, r, 0, N, 1, 1);
  long long lsum0 = tree.RSQ(tree.sum0, l, tar, 0, N, 1, 1),
            rsum0 = tree.RSQ(tree.sum0, tar, r, 0, N, 1, 1);
  long long lsum1 = tree.RSQ(tree.sum1, l, tar, 0, N, 1, 1),
            rsum1 = tree.RSQ(tree.sum1, tar, r, 0, N, 1, 1);
  long long lans =
      (pos[tar] * lsum0 % MOD - lpsum - tar * lsum0 % MOD + lsum1) % MOD;
  long long rans =
      (rpsum - pos[tar] * rsum0 % MOD - rsum1 + tar * rsum0 % MOD) % MOD;
  return (lans + rans) % MOD;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int Q;
  cin >> N >> Q;
  for (int i = 1; i <= N; i++) {
    cin >> pos[i];
  }
  for (int i = 1; i <= N; i++) {
    cin >> w[i];
    tree.update(i, 0, N, 1);
  }
  for (int i = 0; i < Q; i++) {
    int a, b;
    cin >> a >> b;
    if (a < 0) {
      w[-a] = b;
      tree.update(-a, 0, N, 1);
    } else {
      cout << (query(a, b) + MOD) % MOD << "\n";
    }
  }
}
