#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

int main(){
    int N,X,K; // 种类,每个跨度,数量
    cin>>N>>X>>K;
    vector<int> shijiandian(K);
    for(int i=0;i<K;i++){
        cin >> shijiandian[i];
    }
    
    int M; //数据数
    cin>>M;
    int max_jm =0; //最长时间
    vector<pair<int,int>> datas(M);//数据
    for(int i=0;i<M;i++){
        int im,jm; //编号,时间
        cin>>im>>jm;
        datas[i]={im,jm};
        if(jm>max_jm) max_jm=jm;
    }

    vector<vector<int>> time_data(max_jm+1); //时间对应数据
    for(auto &d :datas){
        time_data[d.second].push_back(d.first);
    }

    vector<int> cnt(N,0);  //cnt 滑动窗口
    int key=0;

    //初始化窗口
    int right_bound = min(X -1,max_jm);
    for(int i=0;i<=right_bound;i++){
        for(int id : time_data[i]){
            if(cnt[id]==0) key++;
            cnt[id]++;  //对应时间有数据,滑动窗口id位置标1
        }
        
    }

    vector<int> key_gather(max_jm+1,0);  //结果集合
    key_gather[0]=key;
    
    //滑动窗口向右
    for(int i=0;i<max_jm;i++){
        //移除左端点 i
        for(int id : time_data[i]){
            cnt[id]--;
            if(cnt[id]==0) key--;
        }

        //添加右端点 i+X
        int x = i+X;
        if(x<=max_jm){
            for(int id : time_data[x]){
                if(cnt[id]==0) key++;
                cnt[id]++;
            }
        }

        key_gather[i+1] = key; 
    }

    for(int i=0;i<K;i++){
        int s = shijiandian[i];
        if(s>max_jm) cout<<0<<" ";
        else cout<<key_gather[s]<<" ";
    }
    
    return 0;
}