using System;
using System.Linq;
using System.Collections.Generic;

namespace Contest
{
  class Program
  {
    static void Main(string[] args)
    {
      Marine2020.D();
    }
    class Marine2020
    {
      public static void A()
      {
        var S = Read.Str();
        Console.WriteLine(S.Substring(0, 3));
      }
      public static void B()
      {
        var A = Read.Long();
        var V = Read.Long();
        var B = Read.Long();
        var W = Read.Long();
        var T = Read.Long();
        var D = Math.Abs(A - B);
        var X = (V - W) * T;
        Console.WriteLine(D <= X ? "YES" : "NO");
      }
      public static void C()
      {
        var N = Read.Int();
        var K = Read.Int();
        var A = Read.IntN();
        var B = new int[N + 1];
        var BNext = new int[N + 1];
        for (int j = 0; j < N; ++j)
        {
          var min = Math.Max(0, j - A[j]);
          var max = Math.Min(N - 1, j + A[j]);
          B[min]++;
          B[max + 1]--;
        }
        if (B[0] == N && B[N] == -N)
        {
          Console.WriteLine(String.Join(" ", Enumerable.Range(0, N).Select(i => N)));
          return;
        }
        for (int i = 0; i < K - 1; ++i)
        {
          var a = 0;
          var BN = new int[N + 1];
          for (int j = 0; j < N; ++j)
          {
            a += B[j];
            var min = Math.Max(0, j - a);
            var max = Math.Min(N - 1, j + a);
            BN[min]++;
            BN[max + 1]--;
          }
          B = BN;
          if (B[0] == N && B[N] == -N)
          {
            Console.WriteLine(String.Join(" ", Enumerable.Range(0, N).Select(k => N)));
            return;
          }
        }
        var ar = 0;
        for(int i = 0; i < N; ++i)
        {
          ar += B[i];
          A[i] = ar;
        }
        Console.WriteLine(String.Join(" ", A));
      }
      public static void D()
      {
        var N = Read.Int();
        var VW = Read.TupleInt(N);
        var Q = Read.Int();
        var VL = Read.TupleInt(Q);

        //var N = 200000;
        ////var VW = Enumerable.Range(0, N).Select(i => i <= 511 ? new Tuple<int, int>(1, 1) : new Tuple<int, int>(2, 1)).ToArray();
        //var VW = Enumerable.Range(0, N).Select(i => new Tuple<int, int>(i, (i % 1000) + 20)).ToArray();
        //var Q = 200000;
        //var VL = Enumerable.Range(0, Q).Select(i => new Tuple<int, int>(i + 1, 100000)).ToArray();

        int threshold = 1024;
        var dp = new int[threshold + 10, 100001];
        for(int i = 1; i < threshold; ++i)
        {
          if (i > N) { break; }
          var V = VW[i - 1].Item1;
          var W = VW[i - 1].Item2;
          for (int j = 0; j < W; ++j)
          {
            dp[i, j] = dp[i / 2, j];
          }
          for (int j = W; j <= 100000; ++j)
          {
            dp[i, j] = Math.Max(dp[i / 2, j], dp[i / 2, j - W] + V);
          }
        }
        var ans = new List<int>();
        foreach(var vl in VL)
        {
          var V = vl.Item1;
          var L = vl.Item2;
          if (V < threshold)
          {
            ans.Add(dp[V, L]);
          }
          else
          {
            var VX = V;
            while (VX >= threshold)
            {
              VX /= 2;
            }
            var W2 = new List<int>();
            var V2 = new List<int>();
            while (V >= threshold)
            {
              W2.Add(VW[V - 1].Item2);
              V2.Add(VW[V - 1].Item1);
              V /= 2;
            }
            int max = 0;
            var X = (1 << W2.Count);
            var LA = Math.Min(4, W2.Count);
            var LB = Math.Min(5, Math.Max(0, W2.Count - 4));
            var W2A = new int[1 << LA];
            var V2A = new int[1 << LA];
            var W2B = new int[1 << LB];
            var V2B = new int[1 << LB];
            for (int i = 0; i < (1 << LA); ++i)
            {
              for (int j = 0; j < LA; ++j)
              {
                if ((i & (1 << j)) > 0)
                {
                  W2A[i] += W2[j];
                  V2A[i] += V2[j];
                }
              }
            }
            for (int i = 0; i < (1 << LB); ++i)
            {
              for (int j = 0; j < LB; ++j)
              {
                if ((i & (1 << j)) > 0)
                {
                  W2B[i] += W2[j + 4];
                  V2B[i] += V2[j + 4];
                }
              }
            }
            for (int i = 0; i < X; ++i)
            {
              var w2 = W2A[i % 16] + W2B[i / 16];
              if (w2 > L) { continue; }
              var v2 = V2A[i % 16] + V2B[i / 16];
              var value = dp[VX, L - w2] + v2;
              max = Math.Max(max, value);
            }
            ans.Add(max);
          }
        }
        Console.WriteLine(String.Join(Environment.NewLine, ans));
      }
    }

    class Util
    {
      public static long[] ASum(long[] array)
      {
        var res = new long[array.Length + 1];
        for (int i = 0; i < array.Length; ++i)
        {
          res[i + 1] = res[i] + array[i];
        }
        return res;
      }
      public static long[,] ASum(long[,] matrix)
      {
        var N = matrix.GetLength(0);
        var M = matrix.GetLength(1);
        var res = new long[N + 1, M + 1];
        for(int i = 0; i < N; ++i)
        {
          for(int j = 0; j < M; ++j)
          {
            res[i + 1, j + 1] = res[i, j + 1] + res[i + 1, j] - res[i, j] + matrix[i, j];
          }
        }
        return res;
      }
      public static Dictionary<T, long> Frequency<T>(T[] array)
      {
        var dict = new Dictionary<T, long>();
        foreach (var a in array)
        {
          if (!dict.ContainsKey(a)) { dict.Add(a, 0); }
          dict[a]++;
        }
        return dict;
      }
    }
    class Bound
    {
      public static int Lowerbound<T1, T2>(SortedList<T1, T2> list, T1 x) where T1 : IComparable<T1>
      {
        return Lowerbound(list.Keys, x);
      }
      public static int Upperbound<T1, T2>(SortedList<T1, T2> list, T1 x) where T1 : IComparable<T1>
      {
        return Upperbound(list.Keys, x);
      }
      public static int Lowerbound<T>(IList<T> list, T x) where T : IComparable<T>
      {
        int min = 0;
        int max = list.Count;
        while (min < max)
        {
          var mid = (min + max) / 2;
          if (list[mid].CompareTo(x) >= 0)
          {
            max = mid;
          }
          else
          {
            min = mid + 1;
          }
        }
        return max;
      }
      public static int Upperbound<T>(IList<T> list, T x) where T : IComparable<T>
      {
        int min = 0;
        int max = list.Count;
        while (min < max)
        {
          var mid = (min + max) / 2;
          if (list[mid].CompareTo(x) > 0)
          {
            max = mid;
          }
          else
          {
            min = mid + 1;
          }
        }
        return max;
      }
      public static int UpperboundInt(List<int> list, int x)
      {
        int min = 0;
        int max = list.Count;
        while (min < max)
        {
          var mid = (min + max) / 2;
          if (list[mid] > x)
          {
            max = mid;
          }
          else
          {
            min = mid + 1;
          }
        }
        return max;
      }
    }

    static class Read
{
static Queue<string> queue = new Queue<string>();
static void Enqueue() { var ss = Console.ReadLine().Split(' '); foreach (var s in ss) { queue.Enqueue(s); } }
public static int Int() { if (queue.Count == 0) { Enqueue(); } return Convert.ToInt32(queue.Dequeue()); }
public static long Long() { if (queue.Count == 0) { Enqueue(); } return Convert.ToInt64(queue.Dequeue()); }
public static string Str() { if (queue.Count == 0) { Enqueue(); } return queue.Dequeue(); }
public static int[] IntN() { return Console.ReadLine().Split(' ').Select(s => Convert.ToInt32(s)).ToArray(); }
public static long[] LongN() { return Console.ReadLine().Split(' ').Select(s => Convert.ToInt64(s)).ToArray(); }
public static ulong[] ULongN() { return Console.ReadLine().Split(' ').Select(s => Convert.ToUInt64(s)).ToArray(); }
public static string[] StrN() { return Console.ReadLine().Split(' '); }
public static Tuple<int, int>[] TupleInt(int n) { List<Tuple<int, int>> list = new List<Tuple<int, int>>(); for (int i = 0; i < n; ++i) { var ab = Read.IntN(); list.Add(new Tuple<int, int>(ab[0], ab[1])); } return list.ToArray(); }
public static Tuple<long, long>[] TupleLong(int n) { List<Tuple<long, long>> list = new List<Tuple<long, long>>(); for (int i = 0; i < n; ++i) { var ab = Read.LongN(); list.Add(new Tuple<long, long>(ab[0], ab[1])); } return list.ToArray(); }
public static Tuple<string, string>[] TupleStr(int n) { List<Tuple<string, string>> list = new List<Tuple<string, string>>(); for (int i = 0; i < n; ++i) { var ab = Read.StrN(); list.Add(new Tuple<string, string>(ab[0], ab[1])); } return list.ToArray(); }
public static Tuple<double, double>[] TupleDouble(int n) { List<Tuple<double, double>> list = new List<Tuple<double, double>>(); for (int i = 0; i < n; ++i) { var ab = Read.LongN(); list.Add(new Tuple<double, double>(ab[0], ab[1])); } return list.ToArray(); }
public static long[,] LongMatrix(int r, int c) { var mat = new long[r, c]; for (int i = 0; i < r; ++i) { var x = Read.LongN(); for (int j = 0; j < c; ++j) { mat[i, j] = x[j]; } } return mat; }
public static Dictionary<int, HashSet<int>> AdjacencyList(int N, int M, bool isDirectional = false)
{
Dictionary<int, HashSet<int>> dict = new Dictionary<int, HashSet<int>>();
for (int i = 0; i <= N; ++i) { dict.Add(i, new HashSet<int>()); }
        for (int i = 0; i < M; ++i) { var ab = Read.IntN(); if (!dict[ab[0]].Contains(ab[1])) { dict[ab[0]].Add(ab[1]); } if (!isDirectional && !dict[ab[1]].Contains(ab[0])) { dict[ab[1]].Add(ab[0]); } }
        return dict;
}
public static Dictionary<int, Dictionary<int, long>> AdjacencyListWithWeight(int N, int M)
{
Dictionary<int, Dictionary<int, long>> dict = new Dictionary<int, Dictionary<int, long>>(); for (int i = 0; i <= N; ++i) { dict.Add(i, new Dictionary<int, long>()); }
for (int i = 0; i < M; ++i) { var ab = Read.IntN(); dict[ab[0]].Add(ab[1], ab[2]); dict[ab[1]].Add(ab[0], ab[2]); }
return dict;
}
}
    }
}


Measured memory_bytes: 437956