#include <bits/stdc++.h>
using namespace std;
char buf[1 << 21], *p1 = buf, *p2 = buf;
inline int read() {
  char ch;
  bool flag = 0;
  int res;
  while (!isdigit(
      ch = (p1 == p2 &&
                    (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2)
                ? EOF
                : *p1++)))
    (ch == '-') && (flag = true);
  for (res = ch - '0'; isdigit(
           ch = (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin),
                             p1 == p2)
                     ? EOF
                     : *p1++));
       res = res * 10 + ch - '0')
    ;
  (flag) && (res = -res);
  return res;
}
char sr[1 << 21], z[20];
int C = -1, Z;
inline void Ot() { fwrite(sr, 1, C + 1, stdout), C = -1; }
inline void print(int x) {
  if (C > 1 << 20) Ot();
  if (x < 0) sr[++C] = 45, x = -x;
  while (z[++Z] = x % 10 + 48, x /= 10)
    ;
  while (sr[++C] = z[Z], --Z)
    ;
  sr[++C] = '\n';
}
const int N = 2e5 + 5;
const long long P = 1e9 + 7;
int n, q;
long long a[N], w[N];
namespace SUM {
long long c[N];
inline void add(int x, long long y) {
  for (; x <= n; x += x & -x) c[x] += y;
}
inline long long que(int x) {
  long long res = 0;
  for (; x; x -= x & -x) res += c[x];
  return res;
}
inline long long query(int l, int r) {
  if (r < l) return 0;
  return que(r) - que(l - 1);
}
}  // namespace SUM
namespace MUL {
long long c[N];
inline void add(int x, long long y) {
  y %= P;
  for (; x <= n; x += x & -x) (c[x] += y + P) %= P;
}
inline long long que(int x) {
  long long res = 0;
  for (; x; x -= x & -x) (res += c[x]) %= P;
  return res;
}
inline long long query(int l, int r) {
  if (r < l) return 0;
  return (que(r) - que(l - 1) + P) % P;
}
}  // namespace MUL
inline int getpos(int ql, int qr) {
  int l = ql, r = qr, mid, res;
  while (l <= r) {
    mid = (l + r) >> 1;
    if (SUM::query(ql, mid) >= SUM::query(mid + 1, qr))
      res = mid, r = mid - 1;
    else
      l = mid + 1;
  }
  return res;
}
void solve(int l, int r) {
  if (l == r) return (void)(print(0));
  int pos = getpos(l, r);
  long long res = 0;
  res = (-MUL::query(l, pos) + (SUM::query(l, pos) % P) * (a[pos] - pos) % P +
         P) %
        P;
  res = (res + MUL::query(pos, r) -
         SUM::query(pos, r) % P * (a[pos] - pos) % P + P) %
        P;
  print(res);
}
int main() {
  n = read(), q = read();
  for (int i = 1; i <= n; ++i) a[i] = read();
  for (int i = 1; i <= n; ++i) {
    w[i] = read(), SUM::add(i, w[i]), MUL::add(i, w[i] * (a[i] - i));
  }
  while (q--) {
    int x = read(), y = read();
    if (x < 0) {
      x = -x, SUM::add(x, -w[x]), MUL::add(x, -w[x] * (a[x] - x));
      w[x] = y, SUM::add(x, y), MUL::add(x, y * (a[x] - x));
    } else
      solve(x, y);
  }
  Ot();
  return 0;
}
