#include <bits/stdc++.h>
using namespace std;
int n, q;
int match[30003];
int matched[30003];
pair<int, int> w[30003], h[30003];
int iw[30003], ih[30003];
struct node {
  long long dt[3][3];
  int s, e;
  node() : s(-1), e(-1) {}
};
node itree[131072];
int max_pos;
long long best_match(int s, int e) {
  int perm[5] = {s, s + 1, s + 2, s + 3, s + 4};
  long long ans = -1;
  do {
    bool fail = false;
    long long sum = 0;
    for (int i = s; i < e; i++) {
      if (h[perm[i - s]].second == w[i].second) {
        fail = true;
        break;
      }
      sum += h[perm[i - s]].first * (long long)w[i].first;
    }
    if (!fail) {
      ans = max(ans, sum);
    }
  } while (next_permutation(perm, perm + (e - s)));
  return ans;
}
void update(int nod) {
  auto &p = itree[nod];
  if (p.s == -1) return;
  for (int l = 0; l < 3; l++) {
    for (int r = 0; r < 3; r++) {
      if (l + p.s > p.e + r + 1 || p.e + r >= n) {
        p.dt[l][r] = -1;
        continue;
      }
      if (l + p.s == p.e + r + 1) {
        p.dt[l][r] = 0;
        continue;
      }
      long long cur = -1;
      if ((r + p.e + 1) - (l + p.s) <= 4) {
        cur = best_match(l + p.s, r + p.e + 1);
      }
      if (p.s != p.e) {
        auto &lc = itree[nod << 1];
        auto &rc = itree[(nod << 1) + 1];
        for (int inner = 0; inner < 3; inner++) {
          if (lc.dt[l][inner] == -1) continue;
          if (rc.dt[inner][r] == -1) continue;
          cur = max(cur, lc.dt[l][inner] + rc.dt[inner][r]);
        }
      }
      p.dt[l][r] = cur;
    }
  }
}
vector<int> toupdate[32768];
int main() {
  scanf("%d%d", &n, &q);
  for (int i = 0; i < n; i++) {
    scanf("%d", &w[i].first);
    w[i].second = i;
  }
  for (int i = 0; i < n; i++) {
    scanf("%d", &h[i].first);
    h[i].second = i;
  }
  sort(w, w + n, greater<pair<int, int>>());
  sort(h, h + n, greater<pair<int, int>>());
  for (int i = 0; i < n; i++) iw[w[i].second] = i;
  for (int i = 0; i < n; i++) ih[h[i].second] = i;
  max_pos = 1;
  itree[1].s = 0, itree[1].e = n - 1;
  for (int i = 1; i <= max_pos; i++) {
    if (itree[i].s == itree[i].e) continue;
    int m = (itree[i].s + itree[i].e) >> 1;
    itree[i << 1].s = itree[i].s;
    itree[i << 1].e = m;
    itree[(i << 1) + 1].s = m + 1;
    itree[(i << 1) + 1].e = itree[i].e;
    max_pos = (i << 1) + 1;
  }
  for (int i = max_pos; i >= 1; i--) {
    update(i);
    if (itree[i].s >= 0) {
      for (int j = itree[i].s; j <= itree[i].e + 2 && j < n; j++) {
        toupdate[j].push_back(i);
      }
    }
  }
  for (int i = 0; i < q; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    a--, b--;
    int p1 = ih[a], p2 = ih[b];
    swap(h[p1].second, h[p2].second);
    ih[h[p1].second] = p1;
    ih[h[p2].second] = p2;
    vector<int> toup(toupdate[p1].size() + toupdate[p2].size());
    merge(toupdate[p1].begin(), toupdate[p1].end(), toupdate[p2].begin(),
          toupdate[p2].end(), toup.begin(), greater<int>());
    toup.resize(unique(toup.begin(), toup.end()) - toup.begin());
    for (auto t : toup) {
      update(t);
    }
    printf("%lld\n", itree[1].dt[0][0]);
  }
  return 0;
}
