#include <bits/stdc++.h>
using namespace std;
const int maxi = 1e6 + 2;
long long a[maxi], w[maxi];
int n, q;
long long mo = 1e9 + 7;
long long bit[maxi];
long long bit1[maxi];
long long bit2[maxi];
void update(long long *bit, int x, long long val) {
  for (int i = x; i < maxi; i += i & (-i)) bit[i] += val;
  return;
}
long long get(long long *bit, int x) {
  long long ans = 0;
  for (int i = x; i > 0; i -= i & (-i)) ans += bit[i];
  return ans;
}
void update2(long long *bit2, int x, long long val) {
  for (int i = x; i < maxi; i += i & (-i)) {
    bit2[i] = (bit2[i] + val) % mo;
    if (bit2[i] < 0) bit2[i] += mo;
  }
  return;
}
long long get2(long long *bit2, int x) {
  long long ans = 0;
  for (int i = x; i > 0; i -= i & (-i)) {
    ans += bit2[i];
    ans %= mo;
  }
  return ans;
}
int main() {
  cin >> n >> q;
  for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
  for (int i = 1; i <= n; i++) scanf("%lld", &w[i]);
  for (int i = 1; i <= n; i++) update2(bit2, i, w[i] * a[i]);
  for (int i = 1; i <= n; i++) update(bit, i, w[i]);
  for (int i = 1; i <= n; i++) update2(bit1, i, 1ll * i * w[i]);
  while (q--) {
    int tip;
    int idx, l;
    scanf("%d", &tip);
    if (tip < 0) {
      idx = -tip;
      tip = 1;
    } else {
      l = tip;
      tip = 2;
    }
    if (tip == 1) {
      long long val;
      scanf("%lld", &val);
      update(bit, idx, -w[idx]);
      update2(bit1, idx, -1ll * idx * w[idx]);
      update2(bit2, idx, -1ll * a[idx] * w[idx]);
      w[idx] = val;
      update(bit, idx, w[idx]);
      update2(bit1, idx, 1ll * idx * w[idx]);
      update2(bit2, idx, 1ll * a[idx] * w[idx]);
    } else {
      int r;
      scanf("%d", &r);
      if (l == r)
        printf("0\n");
      else {
        int li = -1;
        int ri = r - l + 1;
        long long sum = get(bit, r) - get(bit, l - 1);
        long long pola = (sum + 1) / 2;
        while (li < ri - 1) {
          int mid = li + ri >> 1;
          long long val = get(bit, l + mid) - get(bit, l - 1);
          if (val >= pola)
            ri = mid;
          else
            li = mid;
        }
        int poz = l + ri;
        long long ans = 0;
        if (poz - 1 >= l) {
          long long x = a[poz] - poz;
          long long sumWi = get(bit, poz - 1) - get(bit, l - 1);
          sumWi %= mo;
          ans += sumWi * x;
          ans %= mo;
          ans += get2(bit1, poz - 1) - get2(bit1, l - 1);
          ans %= mo;
          if (ans < 0) ans += mo;
          ans -= (get2(bit2, poz - 1) - get2(bit2, l - 1));
          ans %= mo;
          if (ans < 0) ans += mo;
        }
        if (poz + 1 <= r) {
          long long x = a[poz] - poz;
          ans += get2(bit2, r) - get2(bit2, poz);
          ans %= mo;
          if (ans < 0) ans += mo;
          ans -= get2(bit1, r) - get2(bit1, poz);
          ans %= mo;
          if (ans < 0) ans += mo;
          long long sumWi = get(bit, r) - get(bit, poz);
          sumWi %= mo;
          ans -= sumWi * x;
          ans %= mo;
          if (ans < 0) ans += mo;
        }
        printf("%lld\n", ans);
      }
    }
  }
  return 0;
}
