#include <cstdio>
#include <algorithm>
using namespace std;
long long int N, ult[100005], arb[300005], v[100005], u[100005], M, K, sum, val, pos, rez[100005];
struct queue
{
long long int x, y, p;
} a[100005];
int cmp(struct queue x, struct queue y)
{
return x.y <= y.y;
}
void update(long long int nod, long long int st, long long int dr)
{
long long int m = (st + dr) / 2;
if (st == dr)
{
arb[nod] = val;
}
else
{
if (pos <= m) update(2 * nod, st, m);
else if (pos > m) update(2 * nod + 1, m + 1, dr);
arb[nod] = arb[2 * nod] + arb[2 * nod + 1];
}
}
void query(long long int nod,long long int st,long long int dr,long long int l,long long int r)
{
long long int m = (st + dr) / 2;
if (l <= st && dr <= r)
{
sum += arb[nod];
}
else
{
if (l <= m) query(2 * nod, st, m, l, r);
if (r > m) query(2 * nod + 1, m + 1, dr, l, r);
}
}
int main()
{
freopen("distincte.in","r",stdin);
freopen("distincte.out","w",stdout);
long long int i, j;
scanf("%lld %lld %lld",&N,&K,&M);
for (i = 1; i <= N; i++)
{
scanf("%lld",&v[i]);
ult[i] = u[v[i]];
u[v[i]] = i;
}
for (i = 0; i < M; i++)
{
scanf("%lld %lld",&a[i].x,&a[i].y);
a[i].p = i;
}
sort(a, a + M, cmp);
i = 0;
for (j = 0; j < M; j++)
{
while (i < a[j].y)
{
i++;
if (ult[i])
{
val = 0; pos = ult[i];
update(1,1,N);
}
val = v[i]; pos = i;
update(1,1,N);
}
sum = 0;
query(1,1,N,a[j].x,a[j].y);
rez[a[j].p] = sum;
}
for (i = 0; i < M; i++) printf("%lld\n",rez[i]);
return 0;
}