#include <bits/stdc++.h>
using namespace std;
long long n, q, A[200010], W[200010], Sm1[800010], Sm2[800010];
void upd(long long x) {
  Sm1[x] = (Sm1[x * 2] + Sm2[x * 2 + 1]) % 1000000007;
  Sm2[x] = (Sm2[x * 2] + Sm2[x * 2 + 1]) % 1000000007;
}
void add1(long long x, long long v) {
  for (long long i = x; i <= n; i += i & -i) Sm1[i] = Sm1[i] + v;
}
void add2(long long x, long long v) {
  for (long long i = x; i <= n; i += i & -i) Sm2[i] = (Sm2[i] + v) % 1000000007;
}
long long ask1(long long x) {
  long long ans = 0;
  for (long long i = x; i; i -= i & -i) ans = ans + Sm1[i];
  return ans;
}
long long ask2(long long x) {
  long long ans = 0;
  for (long long i = x; i; i -= i & -i) ans = (ans + Sm2[i]) % 1000000007;
  return ans;
}
int main() {
  scanf("%lld%lld", &n, &q);
  for (long long i = 1; i <= n; i++) scanf("%lld", &A[i]);
  for (long long i = 1; i <= n; i++) scanf("%lld", &W[i]);
  for (long long i = 1; i <= n; i++) {
    add1(i, W[i]);
    add2(i, (A[i] - i) * W[i] % 1000000007);
  }
  for (long long T = 1; T <= q; T++) {
    long long a, b;
    scanf("%lld%lld", &a, &b);
    if (a > 0) {
      long long o = ask1(a - 1), p = ask1(b), v = p - o;
      long long ans = a;
      for (long long l = a, r = b; l <= r;) {
        long long md = (l + r) / 2;
        if ((ask1(md) - o) * 2 >= v)
          ans = md, r = md - 1;
        else
          l = md + 1;
      }
      long long tot =
          (A[ans] - ans) * ((ask1(ans) - ask1(a - 1)) % 1000000007) -
          (ask2(ans) - ask2(a - 1));
      tot = tot + (ask2(b) - ask2(ans)) -
            (A[ans] - ans) * ((ask1(b) - ask1(ans)) % 1000000007);
      printf("%lld\n", (tot % 1000000007 + 1000000007) % 1000000007);
    } else {
      a = -a;
      add1(a, -W[a]);
      add2(a, -(A[a] - a) * W[a] % 1000000007);
      W[a] = b;
      add1(a, W[a]);
      add2(a, (A[a] - a) * W[a] % 1000000007);
    }
  }
  return 0;
}
