← Home
package main

import (
	"bufio"
	"io"
	"os"
	"sort"
	"strconv"
)

type Item struct {
	c int64
	q int64
}

type Node struct {
	val int64
	sum int64
	pr  uint64
	l   *Node
	r   *Node
}

func sum(t *Node) int64 {
	if t == nil {
		return 0
	}
	return t.sum
}

func pull(t *Node) {
	if t != nil {
		t.sum = t.val + sum(t.l) + sum(t.r)
	}
}

var seed uint64 = 88172645463393265

func rnd() uint64 {
	seed ^= seed << 7
	seed ^= seed >> 9
	return seed
}

func merge(a, b *Node) *Node {
	if a == nil {
		return b
	}
	if b == nil {
		return a
	}
	if a.pr > b.pr {
		a.r = merge(a.r, b)
		pull(a)
		return a
	}
	b.l = merge(a, b.l)
	pull(b)
	return b
}

func splitBySum(t *Node, x int64) (*Node, *Node) {
	if t == nil {
		return nil, nil
	}
	ls := sum(t.l)
	if x <= ls {
		a, b := splitBySum(t.l, x)
		t.l = b
		pull(t)
		return a, t
	}
	if x <= ls+t.val {
		left := t.l
		t.l = nil
		pull(t)
		return left, t
	}
	a, b := splitBySum(t.r, x-ls-t.val)
	t.r = a
	pull(t)
	return t, b
}

func collect(t *Node, res *[]int64) {
	if t == nil {
		return
	}
	collect(t.l, res)
	*res = append(*res, t.val)
	collect(t.r, res)
}

func nextInt(data []byte, idx *int) int64 {
	n := len(data)
	for *idx < n && (data[*idx] < '0' || data[*idx] > '9') {
		*idx++
	}
	var v int64
	for *idx < n && data[*idx] >= '0' && data[*idx] <= '9' {
		v = v*10 + int64(data[*idx]-'0')
		*idx++
	}
	return v
}

func upperBound(a []int64, x int64) int {
	l, r := 0, len(a)
	for l < r {
		m := (l + r) >> 1
		if a[m] <= x {
			l = m + 1
		} else {
			r = m
		}
	}
	return l
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0

	n := int(nextInt(data, &idx))
	items := make([]Item, n)
	for i := 0; i < n; i++ {
		c := nextInt(data, &idx)
		q := nextInt(data, &idx)
		items[i] = Item{c: c, q: q}
	}

	sort.Slice(items, func(i, j int) bool {
		if items[i].q != items[j].q {
			return items[i].q < items[j].q
		}
		return items[i].c > items[j].c
	})

	var root *Node
	for i := 0; i < n; i++ {
		left, right := splitBySum(root, items[i].c)
		node := &Node{val: items[i].c, sum: items[i].c, pr: rnd()}
		root = merge(merge(left, node), right)
	}

	seq := make([]int64, 0, n)
	collect(root, &seq)

	pref := make([]int64, n)
	var s int64
	for i := 0; i < n; i++ {
		s += seq[i]
		pref[i] = s
	}

	k := int(nextInt(data, &idx))
	out := make([]byte, 0, k*4)
	for i := 0; i < k; i++ {
		b := nextInt(data, &idx)
		ans := upperBound(pref, b)
		if i > 0 {
			out = append(out, ' ')
		}
		out = strconv.AppendInt(out, int64(ans), 10)
	}
	out = append(out, '\n')

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	w.Write(out)
	w.Flush()
}