#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
struct Node {
  int l, r, cnt, t_c, t_v;
  int key, val, siz;
} T[MAXN];
struct Shirt {
  int pr, qu;
  bool operator<(const Shirt &a) const {
    return qu > a.qu || qu == a.qu && pr < a.pr;
  }
} A[MAXN];
int B[MAXN], root, N, M;
int Get_Rand() { return rand() * rand(); }
void Update(int nt) { T[nt].siz = T[T[nt].l].siz + T[T[nt].r].siz + 1; }
void Mark(int nt, int t_c, int t_v) {
  if (!nt) return;
  T[nt].cnt += t_c, T[nt].val += t_v;
  T[nt].t_c += t_c, T[nt].t_v += t_v;
}
void Down(int nt) {
  if (!nt) return;
  Mark(T[nt].l, T[nt].t_c, T[nt].t_v), Mark(T[nt].r, T[nt].t_c, T[nt].t_v);
  T[nt].t_c = T[nt].t_v = 0;
}
int Merge(int a, int b) {
  if (!a || !b) return a ^ b;
  Down(a), Down(b);
  if (T[a].key > T[b].key) {
    T[a].r = Merge(T[a].r, b);
    Update(a);
    return a;
  }
  T[b].l = Merge(a, T[b].l);
  Update(b);
  return b;
}
pair<int, int> Split(int root, int siz) {
  if (!siz) return pair<int, int>(0, root);
  Down(root);
  if (siz <= T[T[root].l].siz) {
    pair<int, int> tmp = Split(T[root].l, siz);
    T[root].l = tmp.second;
    Update(root);
    return pair<int, int>(tmp.first, root);
  }
  pair<int, int> tmp = Split(T[root].r, siz - T[T[root].l].siz - 1);
  T[root].r = tmp.first;
  Update(root);
  return pair<int, int>(root, tmp.second);
}
int Min(int nt) {
  for (; T[nt].l;) {
    Down(nt);
    nt = T[nt].l;
  }
  return nt;
}
int Max(int nt) {
  for (; T[nt].r;) {
    Down(nt);
    nt = T[nt].r;
  }
  return nt;
}
void MoveL(int &nt) {
  if (!T[nt].l) {
    Down(nt);
    int r = T[nt].r;
    T[nt].r = 0;
    Update(nt);
    nt = r;
    return;
  }
  static int Stk[MAXN];
  int top = 0, bak = nt;
  for (; nt;) Stk[++top] = nt, Down(nt), nt = T[nt].l;
  int p = Stk[top];
  nt = Stk[top - 1];
  T[nt].l = T[p].r, T[p].r = 0, Update(p), Update(nt);
  for (; top; top--) Update(Stk[top]);
  nt = bak;
}
void Insert(int &root, int nt) {
  int siz = 0;
  for (int j = root; j;) {
    Down(j);
    if (T[nt].val <= T[j].val)
      j = T[j].l;
    else if (T[nt].val > T[j].val)
      siz += 1 + T[T[j].l].siz, j = T[j].r;
  }
  pair<int, int> cur = Split(root, siz);
  root = Merge(Merge(cur.first, nt), cur.second);
}
void Dfs(int root) {
  if (!root) return;
  Down(root);
  Dfs(T[root].l), Dfs(T[root].r);
}
int main() {
  scanf("%d", &N);
  for (int i = 1; i <= N; i++) scanf("%d%d", &A[i].pr, &A[i].qu);
  sort(A + 1, A + N + 1);
  scanf("%d", &M);
  for (int i = 1; i <= M; i++) scanf("%d", &B[i]);
  for (int i = 1; i <= M; i++)
    T[i].key = Get_Rand(), T[i].val = B[i], T[i].siz = 1;
  for (int i = 1; i <= M; i++) Insert(root, i);
  for (int i = 1; i <= N; i++) {
    int siz = 0;
    for (int j = root; j;) {
      Down(j);
      if (A[i].pr <= T[j].val)
        j = T[j].l;
      else if (A[i].pr > T[j].val)
        siz += 1 + T[T[j].l].siz, j = T[j].r;
    }
    pair<int, int> cur = Split(root, siz);
    Mark(cur.second, 1, -A[i].pr);
    int q = Max(cur.first);
    for (int p; (p = Min(cur.second)) && q && T[p].val < T[q].val;) {
      MoveL(cur.second);
      Insert(cur.first, p);
    }
    root = Merge(cur.first, cur.second);
  }
  Dfs(root);
  for (int i = 1; i <= M; i++) printf("%d%c", T[i].cnt, i == M ? '\n' : ' ');
  return 0;
}
