#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("distincte.in");
ofstream out("distincte.out");
struct el{
int st, dr, ind;
};
bool comp(el a, el b) {
return a.dr < b.dr;
}
const int NMAX = 100005;
const int MMAX = 100005;
long long n, m, k, i, lastpos[NMAX], v[NMAX], sol[NMAX], aint[4*NMAX];
el queries[MMAX];
void build(int nod, int st, int dr){
if(st == dr)
aint[nod] = v[st];
else {
int mij = (st + dr) / 2;
build(2*nod, st, mij);
build(2*nod+1, mij+1,dr);
aint[nod] = aint[2*nod] + aint[2*nod+1];
}
}
void update(int nod, int st, int dr, int pos, int val) {
if(st == dr)
aint[nod] = val;
else {
int mij = (st + dr) / 2;
if(pos <= mij)
update(2*nod,st,mij,pos,val);
else
update(2*nod+1,mij+1,dr,pos,val);
aint[nod] = aint[2*nod] + aint[2*nod+1];
}
}
int query(int nod, int st, int dr, int x, int y) {
if(x <= st && y >= dr) {
return aint[nod];
}
else {
int mij = (st + dr) / 2;
if(y <= mij)
return query(2*nod,st, mij,x,y);
else if(x>=mij+1)
return query(2*nod+1, mij+1, dr, x, y);
else
return query(2*nod,st, mij,x,y) + query(2*nod+1, mij+1, dr, x, y);
}
}
int main()
{
in >> n >> k >> m;
for(i = 1; i <= n; ++i)
in >> v[i];
build(1, 1, n);
for(i = 1; i <= m; ++i) {
in >> queries[i].st >> queries[i].dr;
queries[i].ind = i;
}
sort(queries + 1, queries + m + 1, comp);
int p = 1;
for(i = 1; i <= m; ++i) {
while(p <= queries[i].dr) {
update(1,1,n,p,v[p]);
if(lastpos[v[p]])
update(1,1,n,lastpos[v[p]],0);
lastpos[v[p]] = p;
p++;
}
sol[queries[i].ind] = query(1,1,n,queries[i].st,queries[i].dr);
}
for(i = 1; i <= m; ++i)
out << sol[i] << '\n';
return 0;
}