1 #include <cstdio>
2 #include <cstring>
3
4 template <class T>
5 __inline T max(const T &a, const T &b)
6 {
7 return a > b ? a : b;
8 }
9
10 template <class T>
11 __inline T min(const T &a, const T &b)
12 {
13 return a < b ? a : b;
14 }
15
16 template <class T>
17 __inline void read(T &x)
18 {
19 static char c;
20
21 x = 0, c = getchar();
22 while (c < 48)c = getchar();
23 while (c > 47)x = x*10 + c - 48, c = getchar();
24 }
25
26 const int mxv = 1E3;
27 const int mxn = 1E3 + 5;
28 const int mxm = 3E5 + 5;
29
30 int N, M;
31
32 int A[mxn];
33 int B[mxn];
34 int C[mxn];
35
36 int D[mxm];
37 int E[mxm];
38 int Q[mxm];
39
40 int hd[mxn], to[mxm], nt[mxm];
41
42 inline void add(int u, int v)
43 {
44 static int tot = 0;
45
46 nt[++tot] = hd[u];
47 to[tot] = v;
48 hd[u] = tot;
49 }
50
51 int f[15][mxn];
52
53 struct data
54 {
55 int pos, val;
56
57 inline data(void) {};
58 inline data(int a, int b)
59 : pos(a), val(b) {};
60 };
61
62 inline void add(int a, int b, int c, int *d)
63 {
64 static data q[mxn];
65
66 for (int i = 0; i < a; ++i)
67 {
68 int l = 0, r = 0;
69
70 q[r++] = data(i, d[i]);
71
72 for (int j = i + a; j <= mxv; j += a)
73 {
74 while (l != r && q[l].pos + a*c < j)++l;
75 while (l != r && q[r - 1].val + b*(j - q[r - 1].pos)/a < d[j])--r;
76
77 q[r++] = data(j, d[j]);
78
79 d[j] = max(d[j], q[l].val + b*(j - q[l].pos)/a);
80 }
81 }
82 }
83
84 void solve(int l, int r, int d)
85 {
86 if (l == r)
87 {
88 for (int i = hd[l]; i; i = nt[i])
89 Q[to[i]] = f[d - 1][E[to[i]]];
90 }
91 else
92 {
93 int mid = (l + r) >> 1;
94
95 memcpy(f[d], f[d - 1], sizeof(f[0]));
96 for (int i = mid + 1; i <= r; ++i)
97 add(A[i], B[i], C[i], f[d]);
98 solve(l, mid, d + 1);
99
100 memcpy(f[d], f[d - 1], sizeof(f[0]));
101 for (int i = l; i <= mid; ++i)
102 add(A[i], B[i], C[i], f[d]);
103 solve(mid + 1, r, d + 1);
104 }
105 }
106
107 signed main(void)
108 {
109 read(N);
110
111 for (int i = 1; i <= N; ++i)
112 {
113 read(A[i]);
114 read(B[i]);
115 read(C[i]);
116 }
117
118 read(M);
119
120 for (int i = 1; i <= M; ++i)
121 {
122 read(D[i]);
123 read(E[i]);
124
125 add(D[i] + 1, i);
126 }
127
128 solve(1, N, 1);
129
130 for (int i = 1; i <= M; ++i)
131 printf("%d\n", Q[i]);
132 }