#include <bits/stdc++.h>
using namespace std;
int t, n, q;
pair<__int128, long long> operator+(pair<__int128, long long> a,
                                    pair<__int128, long long> b) {
  return {a.first + b.first, a.second + b.second};
}
pair<__int128, long long> operator-(pair<__int128, long long> a,
                                    pair<__int128, long long> b) {
  return {a.first - b.first, a.second - b.second};
}
pair<__int128, long long> zer = {0, 0};
struct ftnt {
  pair<__int128, long long> ft[200010];
  void ini() { fill(ft, ft + 200010, zer); }
  void upd(int a, pair<__int128, long long> val) {
    for (int i = a; i < 200010; i += i & (-i)) ft[i] = ft[i] + val;
  }
  pair<__int128, long long> som(int a) {
    pair<__int128, long long> s = {0, 0};
    for (int i = a; i > 0; i -= i & (-i)) s = s + ft[i];
    return s;
  }
} ft1, ft2;
__int128 a[200010], w[200010];
int suc[200010], prec[200010];
int l, r, ses;
__int128 f(int i) {
  pair<__int128, long long> le = zer, ri = zer;
  if (i != l) {
    le = ft2.som(i - 1);
    if (l > 1) le = le - ft2.som(l - 1);
  }
  if (r > 1) {
    ri = ft1.som(r) - ft1.som(i);
  }
  le.first -= (1000000000 + 10 - a[i] - n + i) * le.second;
  ri.first -= (a[i] - i + 1) * ri.second;
  return le.first + ri.first;
}
__int128 ternarySearch(int l, int r) {
  __int128 mim = min(f(l), f(r));
  r = prec[r], l = suc[l];
  while (r >= l) {
    int mid1 = l + (r - l) / 3;
    int mid2 = r - (r - l) / 3;
    mid1 = suc[mid1];
    mid2 = prec[mid2];
    if (mid1 > mid2) {
      int t1, t2;
      if (mid1 >= r || mid2 <= l) {
        break;
      }
      t1 = mid2 - 1;
      t2 = mid1 + 1;
      __int128 a = f(t1);
      __int128 b = f(t2);
      __int128 c = f(mid1);
      if (c <= a && c <= b) return c;
      if (a > b)
        l = t2;
      else
        r = t1;
    } else {
      __int128 a = f(mid1);
      __int128 b = f(mid2);
      mim = min({mim, a, b});
      if (a > b)
        l = mid1 + 1;
      else
        r = mid2 - 1;
    }
    r = prec[r], l = suc[l];
  }
  ses = r;
  mim = min({mim, f(l), f(r)});
  return mim;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n >> q;
  ft1.ini(), ft2.ini();
  for (int i = 1; i <= n; i++) {
    long long x;
    cin >> x;
    a[i] = x;
  }
  for (int i = 1; i <= n; i++) {
    long long x;
    cin >> x;
    w[i] = x;
    ft1.upd(i, {(a[i] - i + 1) * w[i], w[i]});
    ft2.upd(i, {(1000000000 + 10 - a[i] - n + i) * w[i], w[i]});
  }
  prec[1] = 1;
  for (int i = 2; i <= n; i++) {
    if (a[i] - 1 == a[i - 1])
      prec[i] = prec[i - 1];
    else
      prec[i] = i;
  }
  suc[n] = n;
  for (int i = n - 1; i > 0; i--) {
    if (a[i] + 1 == a[i + 1])
      suc[i] = suc[i + 1];
    else
      suc[i] = i;
  }
  for (int i = 0; i < q; i++) {
    long long x, y;
    cin >> x >> y;
    if (x > 0) {
      l = x, r = y;
      __int128 mim = ternarySearch(l, r);
      long long ris = mim % 1000000007;
      cout << ris << "\n";
    } else {
      x = -x;
      __int128 kek = y;
      ft1.upd(x, {(a[x] - x + 1) * (kek - w[x]), kek - w[x]});
      ft2.upd(x, {(1000000000 + 10 - a[x] - n + x) * (kek - w[x]), kek - w[x]});
      w[x] = kek;
    }
  }
}
