#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=0,f=1;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c==‘-‘) f=-1;
for(;isdigit(c);c=Getchar()) x=x*10+c-‘0‘;
return x*f;
}
const int maxn=1000010;
int n,m,r,next[maxn],last[maxn],A[maxn],ans[maxn];
struct Query {
int l,r,id;
bool operator < (const Query& ths) const {
return l<ths.l;
}
}Q[maxn];
int c[maxn];
int sum(int x) {
int res=0;
for(;x;x-=x&-x) res+=c[x];
return res;
}
void add(int x,int v) {
if(!x) return;
for(;x<=n;x+=x&-x) c[x]+=v;
}
int main() {
n=read();r=read();m=read();
rep(i,1,n) A[i]=read();
rep(i,1,m) Q[Q[i].id=i].l=read(),Q[i].r=read();
dwn(i,n,1) next[i]=last[A[i]],last[A[i]]=i;
rep(i,1,r) add(next[last[i]],1);
int l=1;
sort(Q+1,Q+m+1);
rep(i,1,m) {
while(l<Q[i].l) {
add(next[l],-1);add(next[next[l]],1);
l++;
}
ans[Q[i].id]=sum(Q[i].r)-sum(Q[i].l-1);
}
rep(i,1,m) printf("%d\n",ans[i]);
return 0;
}