#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
int a[200005], w[200005];
long long pen[200005];
int add(int x, int y) { return ((x + y) % mod + mod) % mod; }
int mul(long long x, long long y) {
  x %= mod;
  y %= mod;
  return (long long)x * y % mod;
}
int mypow(int x, int c) {
  int ret = 1;
  while (c > 0) {
    if (c & 1) {
      ret = mul(ret, x);
    }
    c /= 2;
    x = mul(x, x);
  }
  return ret;
}
void update(int ind, long long ad) {
  while (ind < 200005) {
    pen[ind] += ad;
    ind += ind & (-ind);
  }
}
long long query(int ind) {
  long long ret = 0;
  while (ind > 0) {
    ret += pen[ind];
    ind = ind & (ind - 1);
  }
  return ret;
}
int seg[200005 * 4];
void init(int pos, int l, int r) {
  if (l == r) {
    seg[pos] = mul(a[l], w[l]);
    return;
  }
  int mid = (l + r) / 2;
  init(pos * 2, l, mid);
  init(pos * 2 + 1, mid + 1, r);
  seg[pos] = add(seg[pos * 2], seg[pos * 2 + 1]);
}
void update(int pos, int l, int r, int ind) {
  if (l == r) {
    assert(l == ind);
    seg[pos] = mul(a[l], w[l]);
    return;
  }
  int mid = (l + r) / 2;
  if (ind <= mid)
    update(pos * 2, l, mid, ind);
  else
    update(pos * 2 + 1, mid + 1, r, ind);
  seg[pos] = add(seg[pos * 2], seg[pos * 2 + 1]);
}
int query(int pos, int l, int r, int ql, int qr) {
  if (r < ql || qr < l) {
    return 0;
  }
  if (ql <= l && r <= qr) {
    return seg[pos];
  }
  int mid = (l + r) / 2;
  return add(query(pos * 2, l, mid, ql, qr),
             query(pos * 2 + 1, mid + 1, r, ql, qr));
}
long long sum(int x, int y) { return query(y) - query(x - 1); }
int pre[200005];
void solve() {
  int n, q;
  scanf("%d %d ", &n, &q);
  for (int i = 1; i <= n; ++i) {
    scanf("%d ", &a[i]);
    a[i] = a[i] - i;
    pre[i] = add(pre[i - 1], a[i]);
  }
  for (int i = 1; i <= n; ++i) {
    scanf("%d ", &w[i]);
    update(i, w[i]);
  }
  init(1, 1, n);
  while (q--) {
    int x, y;
    scanf("%d %d ", &x, &y);
    if (x < 0) {
      int ind = -x;
      update(ind, -w[ind] + y);
      w[ind] = y;
      update(1, 1, n, ind);
    } else {
      if (y - x == 0) {
        printf("0\n");
      } else {
        int l = x, r = y, mid;
        long long total = sum(x, y);
        while (l < r) {
          mid = (l + r) / 2;
          if (sum(x, mid) * 2 > total) {
            r = mid;
          } else {
            l = mid + 1;
          }
        }
        assert(sum(x, l - 1) * 2 <= total);
        int ret = ret = add(mul(sum(x, l), a[l]), -query(1, 1, n, x, l));
        ret = add(ret, query(1, 1, n, l, y));
        ret = add(ret, -mul(sum(l, y), a[l]));
        printf("%d\n", ret);
      }
    }
  }
}
int main() {
  solve();
  return 0;
}
