#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 60000;
struct node {int x, y, k[2];} b[maxn];
struct bian {int a, b, c;} g[maxn * 8];
struct point{int k[2];} d[maxn * 8];
long long s[maxn], ans;
int i, n, m, a[maxn], lim, h, mid, bh[maxn * 2], f[maxn], num, e[maxn * 2], next[maxn * 2], first[maxn], tot;
int comx(int p, int q) {return b[p].x < b[q].x;}
int comy(int p, int q) {return b[p].y < b[q].y;}
int comc(const bian &p, const bian &q) {return p.c < q.c;}
int dist(int p, int q) {return abs(b[p].x - b[q].x) + abs(b[p].y - b[q].y);}
int maxbh(int p, int q, int k) {return b[p].k[k] > b[q].k[k] ? p : q;}
int minbh(int p, int q, int k) {return b[p].k[k] < b[q].k[k] ? p : q;}
int getfa(int x) {if (f[x] != x) f[x] = getfa(f[x]); return f[x];}
long long gcd(long long p, long long q) {return (!p || !q) ? p + q : gcd(q, p % q);}
void link(int u, int v)
{
    e[++num] = v, next[num] = first[u], first[u] = num;
    e[++num] = u, next[num] = first[v], first[v] = num;
}
void add(int x, int k)
{
    int y = h + b[x].k[1]; d[y].k[0] = minbh(d[y].k[0], x, 0);
    for (y >>= 1; y; y >>= 1) d[y].k[0] = minbh(d[y << 1].k[0], d[y << 1 ^ 1].k[0], 0);
    y = h + b[x].k[0];
    d[y].k[1] = k ? maxbh(x, d[y].k[1], 1) : minbh(d[y].k[1], x, 1);
    for (y >>= 1; y; y >>= 1)
    d[y].k[1] = k ? maxbh(x, d[y << 1].k[1], 1) : minbh(d[y << 1 ^ 1].k[1], x, 1);
}
int ask(int l, int r, int k, int boss)
{
    for (mid = 0, l += h - 1, r += h + 1; (l ^ r) != 1; l >>= 1, r >>= 1)
    {
    if (!(l & 1)) mid = boss ? maxbh(mid, d[l + 1].k[k], k) : minbh(mid, d[r - 1].k[k], k);
    if (r & 1) mid = boss ? maxbh(mid, d[r - 1].k[k], k) : minbh(mid, d[r - 1].k[k], k);
    } return mid;
}
void manhattan()
{
    sort(bh + 1, bh + m + 1, comx);
    b[0].k[0] = maxn * 3, b[0].k[1] = -1;
    for (add(bh[m], 1), i = m - 1; i; add(bh[i], 1), --i)
    {
    g[++tot].a = bh[i], g[tot].b = ask(b[bh[i]].k[1], lim, 00);
    g[tot].c = dist(g[tot].a, g[tot].b);
    if (g[tot].b == 0) --tot;
    g[++tot].a = bh[i], g[tot].b = ask(1, b[bh[i]].k[0], 11);
    g[tot].c = dist(g[tot].a, g[tot].b);
    if (g[tot].b == 0) --tot;
    }
    b[0].k[1] = b[0].k[0];
    memset(d, 0sizeof(d));
    sort(bh + 1, bh + m + 1, comy);
    for (add(bh[m], 0), i = m - 1; i; add(bh[i], 0), --i)
    {
    g[++tot].a = bh[i], g[tot].b = ask(1, b[bh[i]].k[1], 00);
    g[tot].c = dist(g[tot].a, g[tot].b);
    if (g[tot].b == 0) --tot;
    g[++tot].a = bh[i], g[tot].b = ask(1, b[bh[i]].k[0], 10);
    g[tot].c = dist(g[tot].a, g[tot].b);
    if (g[tot].b == 0) --tot;
    }
}
void kruskal()
{
    sort(g + 1, g + tot + 1, comc);
    for (i = 1; i <= tot; ++i)
    {
    int f1 = getfa(g[i].a), f2 = getfa(g[i].b);
    if (f1 != f2) link(g[i].a, g[i].b), f[f1] = f2;
    } tot = 0; memset(f, 0sizeof(f));
}
void dfs(int x, int fa)
{
    bh[++tot] = x;
    for (int p = first[x]; p; p = next[p])
    if (e[p] != fa) dfs(e[p], x), bh[++tot] = x;    
}
void del(int l, int r)
{
    if (l > r) return ;
    for (int j = l; j <= r; ++j)
    ans -= 1LL * f[a[j]] * f[a[j]], ans += 1LL * (--f[a[j]]) * f[a[j]];
}
void ins(int l, int r)
{
    if (l > r) return ;
    for (int j = l; j <= r; ++j)
    ans -= 1LL * f[a[j]] * f[a[j]], ans += 1LL * (++f[a[j]]) * f[a[j]];
}
int main()
{
    freopen("hose.in""r", stdin);
    freopen("hose.out""w", stdout);
    scanf("%d%d", &n, &m);
    for (i = 1; i <= n; ++i) scanf("%d", &a[i]);
    for (i = 1; i <= m; ++i) 
    {
    scanf("%d%d", &b[bh[i] = f[i] = i].x, &b[i].y);
    b[i].k[0] = b[i].x + b[i].y;
    b[i].k[1] = b[i].y - b[i].x + maxn;
    lim = max(lim, max(b[i].k[0], b[i].k[1]));
    }
    for (h = 1; h <= lim; h <<= 1);
    manhattan(), kruskal(), dfs(10);
    ins(b[bh[1]].x, b[bh[1]].y);
    for (s[1] = ans, i = 2; i <= tot; s[bh[i]] = ans, ++i)
    {
    ins(b[bh[i]].x, b[bh[i - 1]].x - 1);
    ins(b[bh[i - 1]].y + 1, b[bh[i]].y);
    del(b[bh[i - 1]].x, b[bh[i]].x - 1);
    del(b[bh[i]].y + 1, b[bh[i - 1]].y);
    }
    for (i = 1; i <= m; ++i)
    {
    long long fz = s[i] - b[i].k[1] - 1 + maxn, fm = 1LL * (b[i].k[1] + 1 - maxn) * (b[i].k[1] - maxn);
    long long gys = gcd(fz, fm);
    printf("%I64d/%I64d\n", fz/gys, fm/gys);
    }
    return 0;
}