#include <bits/stdc++.h>
using namespace std;
ifstream fin("distincte.in");
ofstream fout("distincte.out");
const int DIM = 1e5 + 17;
long long arb[DIM * 6];
int v[DIM];
int prv[DIM];
struct Segment
{
int l;
int r;
int id;
long long res;
};
Segment t[DIM];
void update(int pos, int l, int r, int x, int val)
{
if(l == r)
{
arb[pos] = 1LL * val;
return ;
}
int mid = (l + r) / 2;
if(x <= mid)
update(pos * 2, l, mid, x, val);
else
update(pos * 2 + 1, mid + 1, r, x, val);
arb[pos] = arb[pos * 2] + arb[pos * 2 + 1];
}
long long query(int pos, int l, int r, int x, int y)
{
if(x <= l && r <= y)
{
return arb[pos];
}
int mid = (l + r) / 2;
long long sum = 0;
if(x <= mid)
sum += query(pos * 2, l, mid, x, y);
if(y > mid)
sum += query(pos * 2 + 1, mid + 1, r, x, y);
return sum;
}
bool cmp1(Segment a, Segment b)
{
return a.r <= b.r;
}
bool cmp2(Segment a, Segment b)
{
return a.id <= b.id;
}
main()
{
int n, m, k;
fin >> n >> k >> m;
for(int i = 1; i <= n; i++)
fin >> v[i];
for(int i = 1; i <= m; i++)
{
fin >> t[i].l >> t[i].r;
t[i].id = i;
}
sort(t + 1, t + 1 + m, cmp1);
int la = 0;
for(int i = 1; i <= m; i++)
{
for(int j = la + 1; j <= t[i].r; j++)
{
update(1, 1, n, j, v[j]);
if(prv[v[j]] != 0)
{
update(1, 1, n, prv[v[j]], 0);
}
prv[v[j]] = j;
}
la = t[i].r;
t[i].res = query(1, 1, n, t[i].l, t[i].r);
}
sort(t + 1, t + 1 + m, cmp2);
for(int i = 1; i <= m; i++)
fout << t[i].res << '\n';
}