#include <bits/stdc++.h>
using namespace std;
const long long LINF = 2e18;
const long long MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int MAXN = 200050;
mt19937 rnd(114514);
struct Node {
  int l, r;
  int val, key;
  int sz, tag;
  int ans, ans_tag;
} tr[MAXN];
int tot, root;
int newnode(int val) {
  tr[++tot].val = val;
  tr[tot].sz = 1;
  tr[tot].key = rand();
  return tot;
}
void update(int now) {
  tr[now].sz = tr[tr[now].l].sz + tr[tr[now].r].sz + 1;
  return;
}
void push_down(int now) {
  if (!now) return;
  if (!tr[now].tag || !tr[now].ans_tag) return;
  tr[tr[now].l].ans += tr[now].ans_tag;
  tr[tr[now].l].ans_tag += tr[now].ans_tag;
  tr[tr[now].l].tag += tr[now].tag;
  tr[tr[now].l].val += tr[now].tag;
  tr[tr[now].r].ans += tr[now].ans_tag;
  tr[tr[now].r].ans_tag += tr[now].ans_tag;
  tr[tr[now].r].tag += tr[now].tag;
  tr[tr[now].r].val += tr[now].tag;
  tr[now].tag = tr[now].ans_tag = 0;
}
void split(int now, int val, int &x, int &y) {
  if (!now) {
    x = y = 0;
    return;
  }
  push_down(now);
  if (tr[now].val <= val) {
    x = now;
    split(tr[now].r, val, tr[now].r, y);
  } else {
    y = now;
    split(tr[now].l, val, x, tr[now].l);
  }
  update(now);
}
int merge(int x, int y) {
  if (!x || !y) return x + y;
  if (tr[x].key > tr[y].key) {
    push_down(x);
    tr[x].r = merge(tr[x].r, y);
    update(x);
    return x;
  } else {
    push_down(y);
    tr[y].l = merge(x, tr[y].l);
    update(y);
    return y;
  }
}
void insert(int &root, int id) {
  int x, y;
  tr[id].l = tr[id].r = 0;
  split(root, tr[id].val, x, y);
  root = merge(merge(x, id), y);
}
void remove(int &root, int val) {
  int x, y, z;
  split(root, val, x, z);
  split(x, val - 1, x, y);
  y = merge(tr[y].l, tr[y].r);
  root = merge(merge(x, y), z);
}
void dfs(int now) {
  push_down(now);
  if (tr[now].l) {
    dfs(tr[now].l);
  }
  if (tr[now].r) {
    dfs(tr[now].r);
  }
}
struct node {
  int p, c;
  bool operator<(const node &rhs) const {
    if (p == rhs.p) {
      return c < rhs.c;
    } else {
      return p > rhs.p;
    }
  }
} a[MAXN];
void mainwork(int T) {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", &a[i].c, &a[i].p);
  }
  sort(a + 1, a + n + 1);
  int m;
  long long val;
  scanf("%d", &m);
  for (int i = 1; i <= m; i++) {
    scanf("%lld", &val);
    insert(root, newnode(val));
  }
  int x, y, z, c, now;
  queue<int> q;
  for (int i = 1; i <= n; i++) {
    c = a[i].c;
    split(root, c - 1, x, y);
    split(y, 2 * c - 1, y, z);
    tr[y].tag -= c;
    tr[y].ans_tag++;
    tr[y].ans++;
    tr[y].val -= c;
    tr[z].tag -= c;
    tr[z].ans_tag++;
    tr[z].ans++;
    tr[z].val -= c;
    q.push(y);
    while (!q.empty()) {
      now = q.front();
      q.pop();
      push_down(now);
      if (tr[now].l) {
        q.push(tr[now].l);
      }
      if (tr[now].r) {
        q.push(tr[now].r);
      }
      insert(x, now);
    }
    root = merge(x, z);
  }
  dfs(root);
  for (int i = 1; i <= m; i++) {
    printf("%d ", tr[i].ans);
  }
}
signed main() {
  int t = 1;
  for (int i = 1; i <= t; i++) {
    mainwork(i);
  }
}
