#include<bits/stdc++.h>
using namespace std;
ifstream in("distincte.in");
ofstream out("distincte.out");
const int N = 100005;
struct Query
{
int st, dr, poz;
};
int aint[N*4],n,m,k,poz[N],v[N];
Query q[N];
void citire()
{
in>>n>>k>>m;
for ( int i = 1 ; i <= n ; i++ )
{
in>>v[i];
}
for ( int i = 1 ; i <= m ; i++ )
{
in>>q[i].st>>q[i].dr;
q[i].poz = i;
}
}
int fs(int nod) { return nod * 2; }
int fd(int nod) { return nod * 2 + 1; }
void update_interval(int nod, int st, int dr, int qs, int qd, int val)
{
if ( qs <= st && dr <= qd )
{
aint[nod] += val;
return;
}
if ( st > qd || qs > dr )
{
return;
}
int mij = ( st + dr ) / 2;
if ( qs <= mij )
update_interval(fs(nod), st, mij, qs, qd, val);
if ( mij < qd )
update_interval(fd(nod), mij + 1, dr, qs, qd, val);
}
int query_poz(int nod, int st, int dr, int poz)
{
if ( st == dr )
{
return aint[nod];
}
int mij = ( st + dr ) / 2;
if ( poz <= mij )
return query_poz(fs(nod), st, mij, poz) + aint[nod];
return query_poz(fd(nod), mij + 1, dr, poz) + aint[nod];
}
int query(int st, int dr)
{
int aux;
if ( st == 1 )
aux = 0;
else
aux = query_poz(1, 1, n, st - 1);
return query_poz(1, 1, n, dr) - aux;
}
bool cmp(Query a, Query b)
{
return a.dr < b.dr;
}
void rez()
{
sort ( q + 1, q + m + 1 , cmp );
int dr = 1;
vector<int> ans(m+1);
for ( int i = 1 ; i <= m ; i++ )
{
while ( dr <= q[i].dr )
{
if ( poz[v[dr]] )
{
update_interval(1, 1, n, poz[v[dr]], n, -v[dr]);
}
poz[v[dr]] = dr;
update_interval(1, 1, n, dr, n, v[dr]);
dr++;
}
ans[q[i].poz] = query(q[i].st, q[i].dr);
}
for ( int i = 1 ; i <= m ; i++ )
{
out<<ans[i]<<'\n';
}
}
int main()
{
citire();
rez();
return 0;
}