#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<map>
#include<queue>
#include<bitset>
#include<stack>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define inf 0x3f3f3f3f
#define eps 1e-9
#define pii pair<int,int>
#define MP make_pair
#define LL long long
#define ULL unsigned long long
#define N ( 1000000 + 10 )
#define M ( 200000 + 10)
#define mod 1000000007
int num[5][N];
int san[N];
int cnt;
int dp[5][N];
int haxi(int x) {
return lower_bound(san, san+cnt, x) - san;
}
struct node{
int x, t;
}t[N];
int f[N];
int dis[4];
int main( ){
int e, s, n, m;
scanf("%d%d%d%d", &e, &s, &n, &m);
cnt = 0;
san[cnt++] = e;
for(int i = 1; i <= n; ++i) {
scanf("%d%d", &t[i].t, &t[i].x);
san[cnt++] = t[i].x;
san[cnt++] = t[i].x + s;
}
for(int i = 1; i <= m; ++i) {
scanf("%d", &f[i]);
san[cnt++] = f[i];
san[cnt++] = f[i] + s;
}
sort(san, san+cnt);
cnt = unique(san, san+cnt) - san;
for(int i = 1; i <= n; ++i) {
int l = haxi(t[i].x), r = haxi(t[i].x+s);
for(int j = t[i].t; j >= 1; --j)
num[j][l] ++, num[j][r] -- ;
}
for(int i = 1; i <= 3; ++i) {
for(int j = 1; j < cnt; ++j) {
num[i][j] += num[i][j-1];
if(num[i][j-1]) dp[i][j] = dp[i][j-1] + san[j] - san[j-1];
else dp[i][j] = dp[i][j-1];
}
}
int ed = haxi(e);
for(int i = 1;i <= m; ++i) {
int st = haxi(f[i]+s);
if(st >= ed) {
printf("0 0\n");
continue;
}
int len = san[ed] - san[st];
int ans1, ans2;
for(int j = 1; j <= 3; ++j)
dis[j] = dp[j][ed] - dp[j][st];// printf("j %d dis %d\n",j, dis[j]);
if(dis[3] >= len)
ans1 = ans2 = 0;
else if(dis[2] >= len) {
ans1 = 0;
ans2 = dis[2] - dis[3];
}
else if(dis[1] >= len) {
ans1 = dis[1] - dis[2];
ans2 = dis[1] - dis[3] - ans1;
}
else ans1 = ans2 = -1;
printf("%d %d\n", ans1, ans2);
}
}