#include <iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
using namespace std;
const int maxn=500010;
int n,q;
struct node
{
int l,r,id;
} query[maxn];
struct Node
{
long long x;
int id,pos;
}a[maxn];
long long ans[maxn];
int k;
int num[maxn];
bool cmp(node a,node b)
{
if(a.l/k==b.l/k)
return a.r<b.r;
return a.l/k<b.l/k;
}
bool Cmp(Node a,Node b)
{
return a.x<b.x;
}
bool CMP(Node a,Node b)
{
return a.pos<b.pos;
}
long long cube(int a)
{
long long tt=(long long)a*a*a;
return tt;
}
void work()
{
memset(num,0,sizeof(num));
long long temp=0;
int L=1;
int R=0;
for(int i=0; i<q; i++)
{
while(R<query[i].r)
{
R++;
temp-=cube(num[a[R].id]);
num[a[R].id]++;
temp+=cube(num[a[R].id]);
}
while(R>query[i].r)
{
temp-=cube(num[a[R].id]);
num[a[R].id]--;
temp+=cube(num[a[R].id]);
R--;
}
while(L<query[i].l)
{
temp-=cube(num[a[L].id]);
num[a[L].id]--;
temp+=cube(num[a[L].id]);
L++;
}
while(L>query[i].l)
{
L--;
temp-=cube(num[a[L].id]);
num[a[L].id]++;
temp+=cube(num[a[L].id]);
}
ans[query[i].id]=temp;
}
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1; i<=n; i++)
{
scanf("%I64d",&a[i].x);
a[i].pos=i;
}
sort(a+1,a+1+n,Cmp);
a[1].id=1;
for(int i=2;i<=n;i++)///离散化
{
if(a[i].x==a[i-1].x)a[i].id=a[i-1].id;
else a[i].id=a[i-1].id+1;
}
sort(a+1,a+1+n,CMP);
scanf("%d",&q);
for(int i=0; i<q; i++)
{
scanf("%d %d",&query[i].l,&query[i].r);
query[i].id=i;
}
k=(int)sqrt(1.0*n);///n和k都是int型,要转换;
sort(query,query+q,cmp);
work();
for(int i=0; i<q; i++)
{
printf("%I64d\n",ans[i]);
}
}
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N = 100010;
struct node
{
int l, r, id;
} query[N];
int n, q, k;
int a[N], b[N], num[N];
ll temp, ans[N];
bool cmp(node a, node b)
{
return a.l/k != b.l/k ? a.l/k < b.l/k :a.r < b.r;
}
void add(int i)///写成函数
{
temp -= (ll)num[i] * num[i] * num[i];
num[i]++;
temp += (ll)num[i] * num[i] * num[i];
}
void del(int i)
{
temp -= (ll)num[i] * num[i] * num[i];
num[i]--;
temp += (ll)num[i] * num[i] * num[i];
}
void work()
{
k = (int)sqrt(1.0*n);
sort(query+1, query+1+q, cmp);
memset(num, 0, sizeof num);
int l = 1, r = 0;
temp = 0;
for(int i = 1; i <= q; i++)
{
while(r < query[i].r) add(a[++r]);
while(r > query[i].r) del(a[r--]);
while(l < query[i].l) del(a[l++]);
while(l > query[i].l) add(a[--l]);
ans[query[i].id] = temp;
}
for(int i = 1; i <= q; i++) printf("%I64d\n", ans[i]);
}
int main()
{
while(~ scanf("%d", &n))
{
for(int i = 1; i <= n; i++) scanf("%d", &a[i]), b[i] = a[i];
sort(b+1, b+1+n);
for(int i = 1; i <= n; i++) a[i] = lower_bound(b+1, b+1+n, a[i]) - b;///离散化
scanf("%d", &q);
for(int i = 1; i <= q; i++) scanf("%d%d", &query[i].l, &query[i].r), query[i].id = i;
work();
}
return 0;
}