#include <bits/stdc++.h>
using namespace std;
constexpr long long mod = 1000000007;
const long long INF = mod * mod;
const double eps = 1e-12;
const double pi = acos(-1.0);
using vec = vector<long long>;
using mat = vector<vec>;
struct SegT {
 private:
  int sz;
  vector<mat> node;
  mat init_c;

 public:
  SegT(vector<mat> v) {
    init_c = mat(3, vec(3, -INF));
    for (int i = 0; i < 3; i++) init_c[i][i] = 0;
    int n = v.size();
    sz = 1;
    while (sz < n) sz *= 2;
    node.resize(2 * sz - 1, init_c);
    for (int i = 0; i < n; i++) {
      node[i + sz - 1] = v[i];
    }
    for (int i = sz - 1 - 1; i >= 0; i--) {
      node[i] = f(node[2 * i + 1], node[2 * i + 2]);
    }
  }
  mat f(mat a, mat b) {
    mat res(3, vec(3, -INF));
    for (int i = 0; i < 3; i++)
      for (int j = 0; j < 3; j++)
        for (int k = 0; k < 3; k++) {
          res[i][j] = max(res[i][j], b[i][k] + a[k][j]);
        }
    return res;
  }
  void update(int k, mat a) {
    k += sz - 1;
    node[k] = a;
    while (k > 0) {
      k = (k - 1) / 2;
      node[k] = f(node[k * 2 + 1], node[k * 2 + 2]);
    }
  }
  mat query(int a, int b, int k = 0, int l = 0, int r = -1) {
    if (r < 0) r = sz;
    if (r <= a || b <= l)
      return init_c;
    else if (a <= l && r <= b)
      return node[k];
    else {
      mat vl = query(a, b, k * 2 + 1, l, (l + r) / 2);
      mat vr = query(a, b, k * 2 + 2, (l + r) / 2, r);
      return f(vl, vr);
    }
  }
};
void solve() {
  int n, q;
  cin >> n >> q;
  vector<long long> a(n);
  for (int i = 0; i < n; i++) cin >> a[i];
  vector<long long> b(n);
  for (int i = 0; i < n; i++) cin >> b[i];
  vector<pair<long long, long long> > as;
  for (int i = 0; i < n; i++) {
    as.push_back({a[i], i});
  }
  sort((as).begin(), (as).end());
  vector<pair<int, int> > bs;
  for (int i = 0; i < n; i++) {
    bs.push_back({b[i], i});
  }
  sort((bs).begin(), (bs).end());
  vector<int> trans(n);
  for (int i = 0; i < n; i++) {
    trans[bs[i].second] = i;
  }
  auto calc = [&](int i) -> mat {
    i++;
    mat res(3, vec(3, -INF));
    res[1][0] = res[2][1] = 0;
    if (i - 3 >= 0) {
      for (int s = 1; s <= 2; s++) {
        bool valid = true;
        long long sum = 0;
        for (int j = 0; j < 3; j++) {
          int to = (s + j) % 3;
          if (as[i - 3 + j].second == bs[i - 3 + to].second) valid = false;
          sum += as[i - 3 + j].first * bs[i - 3 + to].first;
        }
        if (valid) {
          res[0][2] = max(res[0][2], sum);
        }
      }
    }
    if (i - 2 >= 0) {
      if (as[i - 2].second != bs[i - 1].second &&
          as[i - 1].second != bs[i - 2].second) {
        res[0][1] = max(res[0][1], as[i - 2].first * bs[i - 1].first +
                                       as[i - 1].first * bs[i - 2].first);
      }
    }
    if (i - 1 >= 0) {
      if (as[i - 1].second != bs[i - 1].second) {
        res[0][0] = max(res[0][0], as[i - 1].first * bs[i - 1].first);
      }
    }
    return res;
  };
  vector<mat> ori(n);
  for (int i = 0; i < n; i++) {
    ori[i] = calc(i);
  }
  SegT st(ori);
  for (int aa = 0; aa < q; aa++) {
    int l, r;
    cin >> l >> r;
    l--;
    r--;
    bs[trans[l]].second = r;
    bs[trans[r]].second = l;
    swap(trans[l], trans[r]);
    for (int j = 0; j < 3; j++) {
      if (trans[l] + j < n) {
        st.update(trans[l] + j, calc(trans[l] + j));
      }
      if (trans[r] + j < n) {
        st.update(trans[r] + j, calc(trans[r] + j));
      }
    }
    mat res = st.query(0, n);
    long long ans = -INF;
    for (int i = 0; i < 3; i++) ans = max(ans, res[0][i]);
    cout << ans << "\n";
  }
}
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  solve();
  return 0;
}
