#include <bits/stdc++.h>
using namespace std;
const int MX = 200005;
const int MD = 1000000007;
int a[MX];
int w[MX];
struct {
  int L, R;
  int pl, pr;
  long long sum, sum2;
} T[2 * MX];
int buildTree(int L, int R) {
  static int tsz = 0;
  int cur = tsz++;
  T[cur].L = L;
  T[cur].R = R;
  if (L < R) {
    T[cur].pl = buildTree(L, (L + R) / 2);
    T[cur].pr = buildTree((L + R) / 2 + 1, R);
    T[cur].sum = T[T[cur].pl].sum + T[T[cur].pr].sum;
    T[cur].sum2 = T[T[cur].pl].sum2 + T[T[cur].pr].sum2;
    T[cur].sum2 %= MD;
  } else {
    T[cur].sum = w[L];
    T[cur].sum2 = (w[L] * 1LL * a[L]) % MD;
  }
  return cur;
}
long long st_S;
int get(int cur, int L) {
  if (L > T[cur].R) return -1;
  if (T[cur].L == T[cur].R) {
    st_S -= T[cur].sum;
    if (st_S <= 0) {
      return T[cur].L;
    }
    return -1;
  }
  if (L >= T[T[cur].pr].L) return get(T[cur].pr, L);
  if (L >= T[cur].L) {
    int tmp = get(T[cur].pl, L);
    if (tmp != -1) return tmp;
    return get(T[cur].pr, L);
  }
  if (T[cur].sum < st_S) {
    st_S -= T[cur].sum;
    return -1;
  }
  int tmp = get(T[cur].pl, L);
  if (tmp != -1) return tmp;
  return get(T[cur].pr, L);
}
long long getSum(int cur, int L, int R) {
  if (L > R) return 0;
  if (L <= T[cur].L && R >= T[cur].R) return T[cur].sum;
  long long sum = 0;
  if (L <= T[T[cur].pl].R && T[T[cur].pl].L <= R) {
    sum += getSum(T[cur].pl, L, R);
  }
  if (L <= T[T[cur].pr].R && T[T[cur].pr].L <= R) {
    sum += getSum(T[cur].pr, L, R);
  }
  return sum;
}
long long getSum2(int cur, int L, int R) {
  if (L > R) return 0;
  if (L <= T[cur].L && R >= T[cur].R) return T[cur].sum2;
  long long sum2 = 0;
  if (L <= T[T[cur].pl].R && T[T[cur].pl].L <= R) {
    sum2 += getSum2(T[cur].pl, L, R);
  }
  if (L <= T[T[cur].pr].R && T[T[cur].pr].L <= R) {
    sum2 += getSum2(T[cur].pr, L, R);
  }
  sum2 %= MD;
  return sum2;
}
void upd(int cur, int i) {
  if (T[cur].L == T[cur].R) {
    T[cur].sum = w[i];
    T[cur].sum2 = (w[i] * 1LL * a[i]) % MD;
    return;
  }
  if (i <= T[T[cur].pl].R)
    upd(T[cur].pl, i);
  else
    upd(T[cur].pr, i);
  T[cur].sum = T[T[cur].pl].sum + T[T[cur].pr].sum;
  T[cur].sum2 = T[T[cur].pl].sum2 + T[T[cur].pr].sum2;
  T[cur].sum2 %= MD;
}
int main() {
  int n, q;
  ignore = scanf("%d %d", &n, &q);
  for (int i = 1; i <= n; i++) {
    ignore = scanf("%d", a + i);
    a[i] -= i;
  }
  for (int i = 1; i <= n; i++) {
    ignore = scanf("%d", w + i);
  }
  int root = buildTree(1, n);
  while (q--) {
    int x, y;
    ignore = scanf("%d %d", &x, &y);
    if (x < 0) {
      x *= -1;
      w[x] = y;
      upd(root, x);
    } else {
      long long S = getSum(root, x, y);
      st_S = (S + 1) / 2;
      int k = get(root, x);
      long long ans = 0;
      ans = getSum(root, x, k - 1) - getSum(root, k + 1, y) + MD;
      ans %= MD;
      ans *= 1LL * a[k];
      ans %= MD;
      ans += getSum2(root, k + 1, y) - getSum2(root, x, k - 1) + MD;
      ans %= MD;
      cout << ans << "\n";
    }
  }
}
