#include <bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast", "unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
const long long inf = numeric_limits<long long>::max() / 2;
const long double eps = 1e-9;
const long double pi = acos(-1);
inline void solve(), read();
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  read();
  solve();
  return 0;
}
struct fenwick {
  long long n;
  vector<long long> t;
  fenwick() {}
  fenwick(long long n_) {
    n = n_;
    t.resize(n);
  }
  long long f(long long i) { return i & (i + 1); }
  long long h(long long i) { return i | (i + 1); }
  void inc(long long ind, long long d) {
    for (long long i = ind; i < n; i = h(i)) {
      t[i] += d;
    }
  }
  long long sum(long long ind) {
    long long ans = 0;
    for (long long i = ind; i >= 0; i = f(i) - 1) {
      ans += t[i];
    }
    return ans;
  }
  long long sum(long long l, long long r) { return sum(r) - sum(l - 1); }
};
const long long R = 1e9 + 7;
long long n, q;
vector<long long> a, w;
fenwick f, g;
long long binsearch(long long l, long long r) {
  long long s = f.sum(l, r) / 2;
  while (r - l > 1) {
    long long m = (l + r) / 2;
    if (f.sum(l, m) >= s) {
      r = m;
    } else {
      l = m;
    }
  }
  return r;
}
inline void query1(long long x, long long w) {
  f.inc(x, -f.sum(x, x));
  f.inc(x, w);
  g.inc(x, -g.sum(x, x));
  g.inc(x, a[x] * w);
}
inline long long query2(long long l, long long r) {
  long long k = binsearch(l, r);
  long long ansl = (a[k] * f.sum(l, k - 1) % R - g.sum(l, k - 1) % R + R) % R;
  long long ansr = (g.sum(k + 1, r) % R - a[k] * f.sum(k + 1, r) % R + R) % R;
  long long ans = (ansl + ansr) % R;
  return ans;
}
inline void solve() {
  f = fenwick(n + 1), g = fenwick(n + 1);
  for (long long i = 1; i <= n; i++) {
    f.inc(i, w[i]);
    g.inc(i, w[i] * a[i]);
  }
  for (long long i = 0; i < q; i++) {
    long long x, y;
    cin >> x >> y;
    if (x < 0) {
      query1(-x, y);
    } else {
      long long ans = query2(x, y);
      cout << ans << "\n";
    }
  }
}
inline void read() {
  cin >> n >> q;
  a.resize(n + 1), w.resize(n + 1);
  for (long long i = 1; i <= n; i++) {
    cin >> a[i];
    a[i] -= i;
  }
  for (long long i = 1; i <= n; i++) {
    cin >> w[i];
  }
}
