#include <cstdio>
#include <algorithm>
using namespace std;
long long a[200005],t[200005];
pair<long long,int> x[200005];
long long treemax[800005],treemin[800005],lazy[800005],sum,ans[200005];
bool flazy[800005];
int p;
void build(int p,int l,int r)
{
    if(l==r)
    {
        treemax[p]=treemin[p]=x[l].first;
        return;
    }
    int mid=(l+r)/2;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
    treemax[p]=max(treemax[p<<1],treemax[p<<1|1]);
    treemin[p]=min(treemin[p<<1],treemin[p<<1|1]);
}
void pushdown(int p,int l,int r)
{
    if(flazy[p])
    {
        treemax[p<<1]=treemin[p<<1]=treemax[p<<1|1]=treemin[p<<1|1]=lazy[p<<1]=lazy[p<<1|1]=lazy[p];
        flazy[p<<1]=flazy[p<<1|1]=true;
        flazy[p]=false;
    }
}
void update(int p,int l,int r,int ql,int qr,long long d)
{
    if(ql==l&&qr==r)
    {
        treemax[p]=treemin[p]=d;
        lazy[p]=d;
        flazy[p]=true;
        return;
    }
    pushdown(p,l,r);
    int mid=(l+r)/2;
    if(qr<=mid)
        update(p<<1,l,mid,ql,qr,d);
    else if(ql>mid)
        update(p<<1|1,mid+1,r,ql,qr,d);
    else
    {
        update(p<<1,l,mid,ql,mid,d);
        update(p<<1|1,mid+1,r,mid+1,qr,d);
    }
    treemax[p]=max(treemax[p<<1],treemax[p<<1|1]);
    treemin[p]=min(treemin[p<<1],treemin[p<<1|1]);
}
int querymin(int p,int l,int r,long long d)
{
    if(l==r)
        return l;
    pushdown(p,l,r);
    int mid=(l+r)/2;
    if(treemin[p<<1|1]<d)
        return querymin(p<<1|1,mid+1,r,d);
    else return querymin(p<<1,l,mid,d);
}
int querymax(int p,int l,int r,long long d)
{
    if(l==r)
        return l;
    pushdown(p,l,r);
    int mid=(l+r)/2;
    if(treemax[p<<1]>d)
        return querymax(p<<1,l,mid,d);
    else return querymax(p<<1|1,mid+1,r,d);
}
long long query(int p,int l,int r,int d)
{
    if(l==r)
        return treemax[p];
    pushdown(p,l,r);
    int mid=(l+r)/2;
    if(d<=mid)
        return query(p<<1,l,mid,d);
    else return query(p<<1|1,mid+1,r,d);
}
int main()
{
    int N,Q;
    scanf("%d",&N);
    for(int i=1;i<=N;i++)
        scanf("%lld%lld",&a[i],&t[i]);
    scanf("%d",&Q);
    for(int i=1;i<=Q;i++)
    {
        scanf("%lld",&x[i].first);
        x[i].second=i;
    }
    sort(x+1,x+Q+1);
    build(1,1,Q);
    for(int i=1;i<=N;i++)
        if(t[i]==1)
            sum+=a[i];
        else if(t[i]==2)
        {
            if(treemin[1]>=a[i]-sum)
                continue;
            p=querymin(1,1,Q,a[i]-sum);
            update(1,1,Q,1,p,a[i]-sum);
        }
        else
        {
            if(treemax[1]<=a[i]-sum)
                continue;
            p=querymax(1,1,Q,a[i]-sum);
            update(1,1,Q,p,Q,a[i]-sum);
        }
    for(int i=1;i<=Q;i++)
        ans[x[i].second]=query(1,1,Q,i);
    for(int i=1;i<=Q;i++)
        printf("%lld\n",ans[i]+sum);
    return 0;
}

#include <bits/stdc++.h>

using namespace std;

template<typename T>
void debug(vector<T> item) {

	for (auto i : item) {
		cout << i << " ";
	}

	cout << endl;
}

int main() {
	int N;

	cin >> N;

	int64_t mn = -(int64_t)1e9;
	int64_t mx = 1e9;

	int64_t sum = 0;
	for (int i = 0; i < N; ++i) {
		int64_t a, b;
		cin >> a >> b;

		if (b == 1) {
			sum += a;
			mn += a;
			mx += a;
		} else if (b == 2) {
			mn = max(a, mn);
			mx = max(a, mx);
		} else {
			mn = min(a, mn);
			mx = min(a, mx);
		}
	}

	int Q;

	cin >> Q;

	for (int i = 0; i < Q; ++i) {
		int64_t q;
		cin >> q;

		q += sum;

		if (mn <= q && q <= mx) {
			cout << q << endl;
		} else if (q < mn) {
			cout << mn << endl;
		} else {
			cout << mx << endl;
		}
	}


	return 0;
}
