#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 1;
const int mod = 1e9 + 7;
long long f[2][maxn];
void upd(int r, long long x, long long ix = 0) {
  for (; r < maxn; r += r & -r) {
    f[ix][r] += x;
  }
}
long long getf(int r, int ix) {
  long long ans = 0;
  for (; r > 0; r -= r & -r) {
    ans += f[ix][r];
  }
  return ans;
}
long long get(int l, int r, int ix = 0) {
  if (l > r) return 0;
  long long ans = getf(r, ix) - getf(l - 1, ix);
  return ans;
}
long long getm(int l, int r, int ix = 0) { return get(l, r, ix) % mod; }
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, q;
  cin >> n >> q;
  long long a[n + 1], w[n + 1];
  for (int i = 0; i < n; i++) {
    cin >> a[i + 1];
    a[i + 1] -= i;
  }
  for (int i = 1; i <= n; i++) {
    cin >> w[i];
    upd(i, w[i], 0);
    upd(i, a[i] * w[i], 1);
  }
  while (q--) {
    long long l, r;
    cin >> l >> r;
    if (l < 0) {
      upd(-l, -w[-l] + r);
      upd(-l, a[-l] * (-w[-l] + r), 1);
      w[-l] = r;
    } else {
      long long lo = l, hi = r, mid = l;
      long long s = get(l, r);
      while (lo < hi - 1) {
        int mid = (lo + hi) / 2;
        long long s1 = get(l, mid);
        if (s1 * 2 <= s)
          lo = mid;
        else
          hi = mid;
      }
      lo++;
      lo = min(lo, r);
      long long ansl =
          ((a[lo] * getm(l, lo - 1) - getm(l, lo - 1, 1) % mod) + mod) % mod;
      long long ansr =
          ((getm(lo + 1, r, 1) - a[lo] * getm(lo + 1, r) % mod) + mod) % mod;
      cout << (ansl + ansr) % mod << '\n';
    }
  }
  return 0;
}
