#include <bits/stdc++.h>
using namespace std;
long long g[100007];
long long m[100007];
struct Node {
  long long c, v;
} a[100007];
struct Tree {
  int l, r, ls, rs;
  long long max;
} tree[100007 << 1];
int tot, f[100007 << 1], p[100007];
void Up(int t) {
  tree[t].max = 0;
  if (tree[t].ls)
    tree[t].max =
        ((tree[t].max) > (tree[tree[t].ls].max) ? (tree[t].max)
                                                : (tree[tree[t].ls].max));
  if (tree[t].rs)
    tree[t].max =
        ((tree[t].max) > (tree[tree[t].rs].max) ? (tree[t].max)
                                                : (tree[tree[t].rs].max));
}
void buildtree(int l, int r) {
  int cnt = ++tot;
  tree[cnt].l = l, tree[cnt].r = r;
  tree[cnt].ls = tree[cnt].rs = 0;
  if (l == r) {
    p[l] = cnt;
    m[l] = -1e+11;
    tree[cnt].max = -1e+11;
    return;
  }
  int mid = (l + r) >> 1;
  if (l <= mid) {
    f[1 + tot] = cnt;
    tree[cnt].ls = 1 + tot;
    buildtree(l, mid);
  }
  ++mid;
  if (mid <= r) {
    f[1 + tot] = cnt;
    tree[cnt].rs = 1 + tot;
    buildtree(mid, r);
  }
  Up(cnt);
}
long long queryMax(int t, int l, int r) {
  if (t <= 0 || l > r) return 0;
  if (l == r) return m[l];
  if (l == tree[t].l && r == tree[t].r) return tree[t].max;
  int mid = (tree[t].l + tree[t].r) >> 1;
  if (r <= mid) return queryMax(tree[t].ls, l, r);
  if (l > mid) return queryMax(tree[t].rs, l, r);
  return ((queryMax(tree[t].ls, l, mid)) > (queryMax(tree[t].rs, mid + 1, r))
              ? (queryMax(tree[t].ls, l, mid))
              : (queryMax(tree[t].rs, mid + 1, r)));
}
void update(int t, long long value) {
  m[t] = value;
  t = p[t];
  tree[t].max = value;
  while (f[t]) {
    t = f[t];
    Up(t);
  }
}
inline int sign(long long x) {
  if (x == 0) return 0;
  if (x > 0) return 1;
  return -1;
}
int main() {
  int n, q;
  int i;
  long long x, y, ans, tmp;
  int c1, c2;
  long long max1, max2;
  scanf("%d%d", &n, &q);
  for (i = 0; i < n; ++i) scanf("%I64d", &a[i].v);
  for (i = 0; i < n; ++i) scanf("%I64d", &a[i].c);
  while (q--) {
    for (i = 0; i < n; ++i) m[a[i].c] = -1e+11;
    scanf("%I64d%I64d", &y, &x);
    ans = 0;
    c1 = c2 = 0;
    max1 = max2 = -1e+11;
    for (i = 0; i < n; ++i) {
      g[i] = -1e+11;
      tmp = (a[i].c != c1) ? max1 : max2;
      tmp = ((tmp) > (0) ? (tmp) : (0));
      g[i] = ((g[i]) > (tmp + x * a[i].v) ? (g[i]) : (tmp + x * a[i].v));
      g[i] = ((g[i]) > (m[a[i].c] + y * a[i].v) ? (g[i])
                                                : (m[a[i].c] + y * a[i].v));
      ans = ((ans) > (g[i]) ? (ans) : (g[i]));
      m[a[i].c] = ((m[a[i].c]) > (g[i]) ? (m[a[i].c]) : (g[i]));
      if (g[i] > max1) {
        if (a[i].c == c1) {
          max1 = g[i];
        } else {
          max2 = max1, c2 = c1;
          max1 = g[i], c1 = a[i].c;
        }
      } else if (g[i] > max2) {
        if (a[i].c == c2) {
          max2 = g[i];
        } else {
          if (a[i].c != c1) {
            max2 = g[i], c2 = a[i].c;
          }
        }
      }
    }
    printf("%I64d\n", ans);
  }
  return 0;
}
