#include #include #include using namespace std; typedef long long LL; const int maxn=60005; struct Query { int l,r,id; LL len; } b[maxn]; int a[maxn],bl[maxn],n,m,blo,cnt[maxn]; LL A[maxn],B[maxn],tot; inline bool cmp(const Query &a,const Query &b) { return bl[a.l]!=bl[b.l]?bl[a.l]b.r); } inline void add(int x) { tot+=((cnt[x]<<1)|1); cnt[x]++; } inline void del(int x) { tot+=1-(cnt[x]<<1); cnt[x]--; } int main() { #ifdef local freopen("pro.in","r",stdin); #endif scanf("%d%d",&n,&m); int blo=n/sqrt(m*2/3); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=m;i++) { scanf("%d%d",&b[i].l,&b[i].r); b[i].len=b[i].r-b[i].l+1; b[i].id=i; B[i]=1; bl[i]=(i-1)/blo+1; } sort(b+1,b+m+1,cmp); int l=b[1].l,r=b[1].r; for(int i=l;i<=r;i++) add(a[i]); LL fz,fm,g; if(tot!=b[1].len) { fz=tot-b[1].len; fm=b[1].len*(b[1].len-1); g=__gcd(fz,fm); A[b[1].id]=fz/g; B[b[1].id]=fm/g; } for(int i=2;i<=m;i++) { while(lb[i].l) add(a[--l]); while(r>b[i].r) del(a[r--]); while(r