#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
int a[300000];
long long w[300000];
struct Segtree {
  int N;
  long long MOD;
  vector<long long> dat;
  Segtree(int n, long long MOD) : MOD(MOD) {
    N = 1;
    while (N < n) N <<= 1;
    dat = vector<long long>(2 * N);
  }
  void update(int k, long long x) {
    k += N;
    dat[k] = x;
    while (k > 1) {
      k >>= 1;
      dat[k] = (dat[k * 2] + dat[k * 2 + 1]) % MOD;
    }
  }
  long long query(int l, int r) {
    long long res = 0;
    for (l += N, r += N; l < r; l >>= 1, r >>= 1) {
      if (l & 1) (res += dat[l++]) %= MOD;
      if (r & 1) (res += dat[--r]) %= MOD;
    }
    return res;
  }
};
int main() {
  int n, q;
  cin >> n >> q;
  for (int i = 0; i < n; i++) {
    scanf("%d", &a[i]);
    a[i] -= i;
  }
  for (int i = 0; i < n; i++) scanf("%lld", &w[i]);
  Segtree seg1(n, LLONG_MAX), seg2(n, MOD);
  for (int i = 0; i < n; i++) {
    seg1.update(i, w[i]);
    seg2.update(i, w[i] * a[i] % MOD);
  }
  for (int i = 0; i < q; i++) {
    int l, r;
    scanf("%d%d", &l, &r);
    if (l < 0) {
      l = -l;
      l--;
      w[l] = r;
      seg1.update(l, w[l]);
      seg2.update(l, w[l] * a[l] % MOD);
    } else {
      l--;
      long long sz = (seg1.query(l, r) + 1) / 2;
      int ok = r - 1, ng = l - 1;
      while (ok - ng > 1) {
        int t = (ok + ng) / 2;
        if (seg1.query(l, t + 1) >= sz)
          ok = t;
        else
          ng = t;
      }
      long long md = a[ok];
      long long s1 =
          (md * seg1.query(l, ok) % MOD + MOD - seg2.query(l, ok)) % MOD;
      long long s2 =
          (seg2.query(ok + 1, r) + MOD - md * seg1.query(ok + 1, r) % MOD) %
          MOD;
      printf("%lld\n", (s1 + s2) % MOD);
    }
  }
}
