#include <bits/stdc++.h>
using namespace std;
const int maxn = 212345;
const int MOD = 1e9 + 7;
struct Fenwick {
  vector<long long> fen;
  int n;
  Fenwick(int n) : fen(n + 1), n(n) {}
  int lowbit(int x) { return x & -x; }
  void add(int x, long long d) {
    while (x <= n) {
      fen[x] += d;
      x += lowbit(x);
    }
  }
  long long query(int x) {
    long long ret = 0;
    while (x) {
      ret = ret + fen[x];
      x -= lowbit(x);
    }
    return ret;
  }
  long long query(int l, int r) {
    if (l > r) return 0;
    int ans = query(r) - query(l - 1);
    return ans;
  }
};
int n, q;
int a[maxn], w[maxn];
int main() {
  scanf("%d%d", &n, &q);
  for (int(i) = (1); (i) <= (n); (i)++) {
    scanf("%d", a + i);
    a[i] -= i;
  }
  for (int(i) = (1); (i) <= (n); (i)++) scanf("%d", w + i);
  Fenwick f1(n), f2(n);
  for (int(i) = (1); (i) <= (n); (i)++) {
    f1.add(i, w[i]);
    f2.add(i, long long(w[i]) * a[i] % MOD);
  }
  while (q--) {
    int x, y;
    scanf("%d%d", &x, &y);
    if (x < 0) {
      x = -x;
      int dw = y - w[x];
      f1.add(x, dw);
      f2.add(x, long long(a[x]) * dw % MOD);
      w[x] = y;
    } else {
      int lo = x, hi = y;
      long long tot = f1.query(x, y);
      while (lo < hi) {
        int mi = lo + hi >> 1;
        if (f1.query(x, mi) * 2 >= tot)
          hi = mi;
        else
          lo = mi + 1;
      }
      long long ans = f1.query(x, lo) % MOD * a[lo] - f2.query(x, lo) % MOD +
                      f2.query(lo + 1, y) % MOD -
                      f1.query(lo + 1, y) % MOD * a[lo];
      ans %= MOD;
      if (ans < 0) ans += MOD;
      printf("%lld\n", ans);
    }
  }
}
