1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
| #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #define ll long long using namespace std; namespace Ehnaev{ inline ll read() { ll ret=0,f=1;char ch=getchar(); while(ch<48||ch>57) {if(ch==45) f=-f;ch=getchar();} while(ch>=48&&ch<=57) {ret=(ret<<3)+(ret<<1)+ch-48;ch=getchar();} return ret*f; } inline void write(ll x) { static char buf[22];static ll len=-1; if(x>=0) {do{buf[++len]=x%10+48;x/=10;}while(x);} else {putchar(45);do{buf[++len]=-(x%10)+48;x/=10;}while(x);} while(len>=0) putchar(buf[len--]); } }using Ehnaev::read;using Ehnaev::write; inline void writeln(ll x) {write(x);putchar(10);}
const ll N=5e4,M=1e3;
inline ll gcd(ll a,ll b) {return (b==0)?a:gcd(b,a%b);}
ll n,m,nn,cnt,sum; ll a[N+5],pos[N+5],col[N+5];
struct Block{ll l,r;}blo[M+5];
struct Qry{ ll l,r,ansmole,ansdeno,id; }q[N+5];
inline bool Cmp1(Qry x,Qry y) {return x.l<y.l;} inline bool Cmp2(Qry x,Qry y) {return x.r<y.r;} inline bool Cmp3(Qry x,Qry y) {return x.r>y.r;} inline bool Cmp4(Qry x,Qry y) {return x.id<y.id;}
inline void Modify(ll from,ll to,bool op) { if(from==to) return; ll type=((from<to)^op); if(type) { if(from<to) { for(ll i=from+1;i<=to;i++) {sum=sum+2*col[a[i]];col[a[i]]++;} } else { for(ll i=from-1;i>=to;i--) {sum=sum+2*col[a[i]];col[a[i]]++;} } } else { if(from<to) { for(ll i=from;i<to;i++) {sum=sum-2*col[a[i]]+2;col[a[i]]--;} } else { for(ll i=from;i>to;i--) {sum=sum-2*col[a[i]]+2;col[a[i]]--;} } } }
inline void Println(ll mole,ll deno) { if(mole==0||deno==0) {printf("0/1\n");return;} ll k=gcd(mole,deno); mole/=k;deno/=k; write(mole);putchar('/');writeln(deno); }
int main() {
n=read();m=read(); nn=max(1ll,(ll)n/(ll)sqrt(m)); for(ll i=1;i<=n;i++) {a[i]=read();} cnt=1; for(ll i=1;i<=n;i+=nn,cnt++) { blo[cnt].l=i;blo[cnt].r=i+nn-1;if(blo[cnt].r>n) blo[cnt].r=n; for(ll j=blo[cnt].l;j<=blo[cnt].r;j++) {pos[j]=cnt;} } cnt--; for(ll i=1;i<=m;i++) {q[i].l=read();q[i].r=read();q[i].id=i;}
sort(q+1,q+m+1,Cmp1); ll lst=1; for(ll i=1,j=1;j<=cnt;j++) { while(pos[q[i].l]==j) { i++; } if(j&1) {sort(q+lst,q+i,Cmp2);} else {sort(q+lst,q+i,Cmp3);} lst=i; }
ll lit=1,rit=1;col[a[1]]++; for(ll i=1;i<=m;i++) { Modify(rit,q[i].r,0);rit=q[i].r; Modify(lit,q[i].l,1);lit=q[i].l; ll len=q[i].r-q[i].l+1; q[i].ansmole=sum;q[i].ansdeno=len*(len-1); }
sort(q+1,q+m+1,Cmp4);
for(ll i=1;i<=m;i++) {Println(q[i].ansmole,q[i].ansdeno);}
return 0; }
|