输入格式
第一行三个整数 n,m,k。
第二行 n 个整数,表示 小B 的序列。
接下来的 m 行,每行两个整数 l,r。
输出格式
输出 m 行,每行一个整数,对应一个询问的答案。
输入输出样例
输入 #1
6 4 3
1 3 2 1 1 3
1 4
2 6
3 5
5 6
输出 #1
6
9
5
2
说明/提示
【数据范围】
对于 100% 的数据,1≤n,m,k≤5*10^4
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn = 50005;
ll c[maxn],sum[maxn],ans[maxn];
ll block,cnt;
struct node
{
int l,r;
ll num;
}q[maxn];
bool cmp(node a,node b)
{
return (a.r/block) == (b.r/block)?a.l<b.l:a.r<b.r;
}
void add(int x)
{
sum[c[x]]++;
cnt += 2*sum[c[x]]-1;
}
void del(int x)
{
sum[c[x]]--;
cnt -= 2*sum[c[x]]+1;
}
int main()
{
ll n,m,k;
scanf("%lld%lld%lld",&n,&m,&k);
block = sqrt(n);
for(int i=1; i<=n; i++)
{
scanf("%lld",&c[i]);
}
for(int i=1; i<=m; i++)
{
scanf("%d%d",&q[i].l,&q[i].r);
q[i].num = i;
}
sort(q+1,q+1+m,cmp);
int l=1,r=0;
cnt = 0;
for(int i=1; i<=m; i++)
{
ll ql = q[i].l,qr = q[i].r;
while(l<ql)
{
del(l);
l++;
}
while(l>ql)
{
l--;
add(l);
}
while(r<qr)
{
r++;
add(r);
}
while(r>qr)
{
del(r);
r--;
}
ans[q[i].num] = cnt;
}
for(int i=1; i<=m; i++)
{
printf("%lld\n",ans[i]);
}
}