#include <bits/stdc++.h>
using namespace std;
inline int Read() {
  char c = getchar();
  int num = 0;
  while ('0' > c || c > '9') c = getchar();
  while ('0' <= c && c <= '9') num = num * 10 + c - '0', c = getchar();
  return (num);
}
long long t[100010 * 4][3][3], A[100010][3][3];
struct Node {
  int a, id;
} w[100010], h[100010];
inline void Up(int x) {
  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++) t[x][i][j] = 0;
  for (int k = 0; k < 3; k++)
    for (int i = 0; i < 3; i++)
      for (int j = 0; j < 3; j++)
        t[x][i][j] = max(t[x][i][j], t[x * 2][i][k] + t[x * 2 + 1][k][j]);
}
inline void Chg(int x, int l, int r, int a) {
  if (l == r) {
    for (int i = 0; i < 3; i++)
      for (int j = 0; j < 3; j++) t[x][i][j] = A[l][i][j];
    return;
  }
  int md = (l + r) / 2;
  if (a <= md) Chg(x * 2, l, md, a);
  if (md < a) Chg(x * 2 + 1, md + 1, r, a);
  Up(x);
}
inline void Build(int x, int l, int r) {
  if (l == r) {
    for (int i = 0; i < 3; i++)
      for (int j = 0; j < 3; j++) t[x][i][j] = A[l][i][j];
    return;
  }
  int md = (l + r) / 2;
  Build(x * 2, l, md), Build(x * 2 + 1, md + 1, r);
  Up(x);
}
int n, m, pw[100010], ph[100010];
inline void Get_tran(int i) {
  for (int k = 0; k < 3; k++)
    for (int l = 0; l < 3; l++) A[i][k][l] = -1e18;
  A[i][0][1] = A[i][1][2] = 0;
  for (int k = 0; k < 3; k++)
    if (i > k) {
      if (w[i - k].id != h[i - k].id)
        A[i][k][k] = w[i - k].a * 1ll * h[i - k].a;
      if (h[i - k].id != w[i - k + 1].id && w[i - k + 1].id != h[i - k].id &&
          k > 0)
        A[i][k][k - 1] = h[i - k].a * 1ll * w[i - k + 1].a +
                         w[i - k].a * 1ll * h[i - k + 1].a;
    }
  if (i > 2 && w[i - 2].id != h[i].id && w[i - 1].id != h[i - 2].id &&
      w[i].id != h[i - 1].id)
    A[i][2][0] = w[i - 2].a * 1ll * h[i].a + w[i - 1].a * 1ll * h[i - 2].a +
                 w[i].a * 1ll * h[i - 1].a;
  if (i > 2 && h[i - 2].id != w[i].id && h[i - 1].id != w[i - 2].id &&
      h[i].id != w[i - 1].id && i > 2)
    A[i][2][0] = max(A[i][2][0], h[i - 2].a * 1ll * w[i].a +
                                     h[i - 1].a * 1ll * w[i - 2].a +
                                     h[i].a * 1ll * w[i - 1].a);
}
bool Cmpa(Node a, Node b) { return (a.a > b.a); }
int main() {
  n = Read(), m = Read();
  for (int i = 1; i <= n; i++) w[i].a = Read(), w[i].id = i;
  for (int i = 1; i <= n; i++) h[i].a = Read(), h[i].id = i;
  sort(w + 1, w + 1 + n, Cmpa);
  sort(h + 1, h + 1 + n, Cmpa);
  for (int i = 1; i <= n; i++) pw[w[i].id] = i, ph[h[i].id] = i;
  for (int i = 1; i <= n; i++) Get_tran(i);
  Build(1, 1, n);
  for (int c = 1; c <= m; c++) {
    int x = Read(), y = Read();
    h[ph[x]].id = y, h[ph[y]].id = x;
    swap(ph[x], ph[y]);
    for (int j = pw[x]; j <= min(n, pw[x] + 2); j++) {
      Get_tran(j);
      Chg(1, 1, n, j);
    }
    for (int j = pw[y]; j <= min(n, pw[y] + 2); j++) {
      Get_tran(j);
      Chg(1, 1, n, j);
    }
    printf("%I64d\n", t[1][0][0]);
  }
}
