#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5, mod = 1e9 + 7;
int n, q;
long long a[maxn], w[maxn];
struct TreeArray {
  long long c[maxn];
  void add(int k, long long a) {
    while (k <= n) {
      c[k] += a;
      k += k & -k;
    }
  }
  void change(int k, long long a) { add(k, a - query(k)); }
  long long query(int k) {
    long long sum = 0;
    while (k) {
      sum += c[k];
      k -= k & -k;
    }
    return sum;
  }
  long long query(int l, int r) { return query(r) - query(l - 1); }
} w_sum, ssum;
int getM(int L, int R) {
  int l = L, r = R, m = (L + R) / 2;
  long long sum = w_sum.query(L, R);
  while (l < m) {
    long long s = 2 * w_sum.query(L, m);
    if (s == sum) return m;
    if (s > sum)
      r = m;
    else
      l = m;
    m = (l + r) / 2;
  }
  if (2 * w_sum.query(L, m) >= sum) return m;
  return r;
}
int main() {
  scanf("%d%d", &n, &q);
  for (int i = 1; i <= n; i++) scanf("%I64d", &a[i]);
  for (int i = 1; i <= n; i++) scanf("%I64d", &w[i]);
  for (int i = 1; i <= n; i++) {
    w_sum.add(i, w[i]);
    ssum.add(i, (a[i] - i) * w[i] % mod);
  }
  while (q--) {
    int l, r;
    scanf("%d%d", &l, &r);
    if (l < 0) {
      w_sum.change(-l, r);
      ssum.change(-l, (a[-l] + l) * r % mod);
    } else {
      int m = getM(l, r);
      int x = a[m];
      long long ans = (x - m) * w_sum.query(l, m - 1) - ssum.query(l, m - 1);
      ans -= (x - m) * w_sum.query(m + 1, r) - ssum.query(m + 1, r);
      ans = (ans % mod + mod) % mod;
      cout << ans << endl;
    }
  }
  return 0;
}
