#include <bits/stdc++.h>
using namespace std;
class Node{
public:
Node(){
left = NULL;
right = NULL;
val = 0;
}
Node* getCopy(){
Node* ret = new Node();
ret->left = this->left;
ret->right = this->right;
ret->val = this->val;
return ret;
}
Node* left;
Node* right;
int val;
private:
};
Node* roots[100005];
class PersistentSegmentTree{
public:
PersistentSegmentTree(int _n){
n = _n;
}
Node* build(int lf, int rg){
Node* ans = new Node();
if(lf < rg){
int md = (lf + rg) >> 1;
ans->left = build(lf, md);
ans->right = build(md + 1, rg);
}
return ans;
}
Node* update(Node* cr, int lf, int rg, int pos, int x){
cr = cr->getCopy();
if(lf > rg){
return cr;
}
if(lf == rg){
cr->val += x;
return cr;
}
int md = (lf + rg) >> 1;
if(pos <= md){
cr->left = update(cr->left, lf, md, pos, x);
}else{
cr->right = update(cr->right, md + 1, rg, pos, x);
}
cr->val = cr->left->val + cr->right->val;
return cr;
}
int query(Node* cr, int lf, int rg, int x, int y){
if(x > rg || y < lf){
return 0;
}
if(x <= lf && rg <= y){
return cr->val;
}
int md = (lf + rg) >> 1;
return query(cr->left, lf, md, x, y) + query(cr->right, md + 1, rg, x, y);
}
private:
int n;
};
int v[100005];
int last[100005];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ifstream fin("distincte.in");
ofstream fout("distincte.out");
int n, k, q;
fin >> n >> k >> q;
PersistentSegmentTree pst(n);
roots[0] = pst.build(0, n);
for(int i = 1;i <= n;i++){
int x;
fin >> x;
roots[i] = pst.update(roots[i - 1], 0, n, i, x);
if(last[x])
roots[i] = pst.update(roots[i], 0, n, last[x], -x);
last[x] = i;
}
for(int i = 1;i <= q;i++){
int x, y;
fin >> x >> y;
fout << pst.query(roots[y], 0, n, x, y) - pst.query(roots[x - 1], 0, n, x, y) << '\n';
}
return 0;
}