#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <cassert>
#include <ctime>
#include <queue>
#include <map>
#include <list>
#include <fstream>
#include <iomanip>
#include <set>

#define For(i,a,b) for(int (i)=(a);(i)<=int(b);(i)++)
#define Ford(i,a,b) for(int (i)=(a);(i)>=int(b);(i)--)
#define Rep(i,a,b) for(int (i)=(a);(i)<int(b);(i)++)
#define type(x) __typeof((x).begin())
#define foreach(it,x) for(type(x) it = (x).begin() ; it!=(x).end() ; it++ )
#define fi first
#define se second
#define dbg(x) cerr<<#x<<":"<<x<<endl
#define dg(x) cerr<<#x<<":"<<x<<' '
#define fill(x,y) memset(x,y,sizeof x)
#define all(x) x.begin(),x.end()
#define bin(x) (1LL<<(x))
#define gcd __gcd
#define pb push_back  
#define mp make_pair 
 
using namespace std;
 
typedef long long Lint;
typedef pair<int,int> ii;
typedef pair<Lint,Lint> Lii;
typedef pair<ii,ii> iii;
 
const int inf = 1e9+5;
const Lint Linf = 1e18+5;
 
template<class T> inline void umax(T &a,T b){if(a<b) a = b ; }
template<class T> inline void umin(T &a,T b){if(a>b) a = b ; }
template<class T> inline T abs(T a){return a>0 ? a : -a;}
template<class T> inline T lcm(T a,T b){
    return a/gcd(a,b)*b;
}

int read(){
int res = 0 ;
int neg ;
while(true){
char ch = getchar();
if((ch>='0' && ch<='9') || ch=='-'){
if(ch=='-') neg = -1;
else neg = 1 , res = ch-'0';
break;
}
}
while(true){
char ch = getchar();
if(ch>='0' && ch<='9') res*=10 , res+=ch-'0';
else break;
}
return res*neg;
}
void print(int x){
 
if(x==0){
putchar('0');
putchar('\n');
return ;
}
static char buf[20];
int nn = 0 ;
if(x<0) putchar('-') , x*=-1;
while(x){
buf[++nn] = x%10+'0';
x/=10;
}
Ford(i,nn,1) putchar(buf[i]);
putchar('\n');
}

const int MAXN = 1e5+5;

set<int> s;
int used[MAXN];

int lazy[MAXN*5];

inline void push_down(int k){
	if(lazy[k]!=-1){
		umax(lazy[k+k],lazy[k]);
		umax(lazy[k+k+1],lazy[k]);
		lazy[k] = -1; 
	}
}

void upd(int k,int b,int e,int x1,int x2,int val){
	if(b>x2 || e<x1) return ;
	if(b>=x1 && e<=x2){
		umax(lazy[k],val);
		return ;
	}
	push_down(k);
	upd(k*2,b,(b+e)/2,x1,x2,val);
	upd(k*2+1,(b+e)/2+1,e,x1,x2,val);
}

int find(int k,int b,int e,int x){
	if(b>x || e<x) return 0;
	if(b==e) return lazy[k];
	push_down(k);
	int L = find(k*2,b,(b+e)/2,x);
	int R = find(k*2+1,(b+e)/2+1,e,x);
	return L+R;
}

void DBG(){
	foreach(it,s)
		printf("%d ",*it);
	puts("");	
}

int main(){
	
	int N = read();
	int M = read();
	int Q = read();
	
	s.insert(0);
	Rep(i,1,N){
		s.insert(i);
		int u = read();
		int v = read();
		assert(u+1==v);
		assert(u==i);
	}
	
	s.insert(N);
	
	For(i,1,M){
		int v = read();
		if(!used[v]){
			type(s) left = s.lower_bound(v);
			left--;
			type(s) right = s.upper_bound(v);
			int L = *left ; 
			int R = *right;
			upd(1,1,N,L+1,R,R-L);
			s.erase(s.find(v));
		}else{
			s.insert(v);
		}
		used[v]^=1; 
	}
	
	while(Q--){
		int u = read();
		print(max(1,find(1,1,N,u))) ;
	}
	
	return 0;
}
