import qualified Data.ByteString.Char8 as BS
import Data.Char
import Data.List
import Control.Monad
import Data.Array
import qualified Data.IntMap as M

main = do
  li <- BS.getLine
  let Just (n,_) = BS.readInt li
  vws <- forM [1..n] get2
  li <- BS.getLine
  let Just (q,_) = BS.readInt li
  vls <- forM [1..q] get2
  let ans = compute n vws vls
  mapM_ print ans

get2 _ = do
  li <- BS.getLine
  let (a:b:_) = unfoldr (BS.readInt . BS.dropWhile isSpace) li
  return (a,b)

compute :: Int -> [(Int,Int)] -> [(Int,Int)] -> [Int]
compute n vws vls =
    [ fst $ M.findMax $ M.filter (l >=) (nstr ! v) | (v,l) <- vls ]
  where
    nstr = listArray (0,n) nslist
    nslist = M.fromList [(0,0)] :
      [ M.unionWith min ns $ M.mapKeys (v +) $ M.map (w +) ns
      | (i,(v,w)) <- zip [1..n] vws
      , let ns = nstr ! (div i 2)
      ]
{-
根から各頂点の方向に、総当たりの価値の組み合わせを作っておき、上限で切る。
ただし遅延評価なので必要なところしか計算しないという作戦。
これarray必要かな？後でindexでアクセスされるからという理由でそうするべきだね。
組み合わせは、価値をkey、それをつくる最も軽い重量をvalにしたIntMapで管理しよう。
-}
