type node=record
l,r,id:int64;
end;
var
cnt,a,answer1,answer2:array[0..1000000]of int64;
q:array[0..1000000]of node;
l,r,ql,qr,n,m,block,ans,g:int64;
i:longint;
function gcd(a,b:int64):int64;
begin
if a mod b=0 then exit(b);
exit(gcd(b,a mod b));
end;
procedure add(x:int64);
begin
ans:=ans+2*cnt[a[x]];
inc(cnt[a[x]])
end;
procedure del(x:int64);
begin
if cnt[a[x]]>0 then
begin
ans:=ans-2*cnt[a[x]]+2;
dec(cnt[a[x]]);
end;
end;
function cmp(a,b:node):boolean;
begin
if a.l div block<>b.l div block then
exit(a.l<b.l);
if (a.l div block)and 1>0 then
exit(a.r<b.r);
exit(a.r<b.r);
end;
procedure sort(l,r:int64);
var
i,j:longint;
p,mid:node;
begin
i:=l;
j:=r;
mid:=q[(l+r)div 2];
repeat
while cmp(q[i],mid) do inc(i);
while cmp(mid,q[j]) do dec(j);
if i<=j then
begin
p:=q[i];q[i]:=q[j];q[j]:=p;
inc(i);dec(j);
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end;
begin
//assign(input,'1494.in');reset(input);
//assign(output,'1494.out');rewrite(output);
readln(n,m);
for i:=1 to n do
begin
read(a[i]);
end;
block:=trunc(n/sqrt(m*2/3));
for i:=1 to m do
begin
readln(q[i].l,q[i].r);
q[i].id:=i;
end;
sort(1,m);
l:=1;
r:=0;
for i:=1 to m do
begin
ql:=q[i].l;qr:=q[i].r;
if ql=qr then
begin
answer1[q[i].id]:=0;
answer2[q[i].id]:=1;
continue;
end;
while(l<ql)do begin del(l);inc(l)end;
while(l>ql)do begin dec(l);add(l)end;
while(r<qr)do begin inc(r);add(r)end;
while(r>qr)do begin del(r);dec(r)end;
answer1[q[i].id]:=ans;
answer2[q[i].id]:=int64(qr-ql+1)*(qr-ql)
end;
for i:=1 to m do
begin
if answer1[i]=0 then
begin
answer2[i]:=1;g:=1;
end else
g:=gcd(answer1[i],answer2[i]);
writeln(answer1[i]div g,'/',answer2[i]div g);
end;
close(input);close(output);
end.
rt,只过了第一个点,后面都是WA