#include <bits/stdc++.h>
using namespace std;
const long long N = 2e5 + 5;
long long n, q, a[N], w[N];
struct node {
  long long sumw, sumi;
  node operator+(const node &rhs) const {
    return {sumw + rhs.sumw, (sumi + rhs.sumi) % 1000000007};
  }
};
class SegmentTree {
 private:
  node t[N << 2];
  void build(long long l, long long r, long long x) {
    if (l == r) {
      t[x] = {w[l], (a[l] - l) * w[l] % 1000000007};
      return;
    }
    long long m = (l + r) >> 1;
    build(l, m, x << 1);
    build(m + 1, r, x << 1 | 1);
    t[x] = t[x << 1] + t[x << 1 | 1];
  }
  node get(long long l, long long r, long long s, long long e, long long x) {
    if (l > r || l > e || r < s) return {0, 0};
    if (s <= l && r <= e) return t[x];
    long long m = (l + r) >> 1;
    return get(l, m, s, e, x << 1) + get(m + 1, r, s, e, x << 1 | 1);
  }
  void upd(long long l, long long r, long long pos, long long x,
           long long val) {
    if (l == r) {
      t[x].sumw = val;
      t[x].sumi = (a[l] - l) * val % 1000000007;
      return;
    }
    long long m = (l + r) >> 1;
    if (pos <= m)
      upd(l, m, pos, x << 1, val);
    else
      upd(m + 1, r, pos, x << 1 | 1, val);
    t[x] = t[x << 1] + t[x << 1 | 1];
  }

 public:
  void build() { build(0, n - 1, 1); }
  node get(long long l, long long r) { return get(0, n - 1, l, r, 1); }
  void upd(long long pos, long long val) { upd(0, n - 1, pos, 1, val); }
} st;
long long get(long long l, long long r, long long fix, long long x) {
  node tmp1 = st.get(l, fix - 1);
  node tmp2 = st.get(fix + 1, r);
  long long sum1 = -tmp1.sumi + x * tmp1.sumw % 1000000007,
            sum2 = tmp2.sumi - x * tmp2.sumw % 1000000007;
  sum1 = (sum1 + 1LL * 1000000007 * 1000000007) % 1000000007;
  sum2 = (sum2 + 1LL * 1000000007 * 1000000007) % 1000000007;
  return (sum1 + sum2) % 1000000007;
}
long long bs(long long l, long long r) {
  long long tmp = st.get(l, r).sumw;
  while (l < r) {
    long long m = (l + r) >> 1;
    if (st.get(l, m).sumw * 2 >= tmp)
      r = m;
    else
      l = m + 1;
  }
  return l;
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> q;
  for (long long i = 0; i < n; i++) cin >> a[i];
  for (long long i = 0; i < n; i++) cin >> w[i];
  st.build();
  while (q--) {
    long long l, r;
    cin >> l >> r;
    if (l < 0) {
      l = -l, l--;
      st.upd(l, r);
    } else {
      l--, r--;
      long long fix = bs(l, r);
      cout << get(l, r, fix, a[fix] - fix) << "\n";
    }
  }
  return 0;
}
