rt,提交记录在这
#include<iostream>
#include<cstdio>
#include<cmath>
const int N = 1107;
int price[N<<4],value[N<<4],cnt;
int separate[N];// 左开右闭
int dp1[N<<4][N],dp2[N<<4][N];
signed main(){
int n,q;
scanf("%d",&n);
for(int i=1,p,v,l;i<=n;i++){
scanf("%d%d%d",&p,&v,&l);
separate[i] = cnt;
for(int times=1;times<=l;times<<=1){
price[++cnt] = p*times;
value[cnt] = v*times;
l -= times;
}
if(l){
price[++cnt] = l*p;
value[cnt] = l*v;
}
}
separate[n+1] = cnt;
//front->back
for(int i=1;i<=cnt+1;i++){
for(int j=0;j<price[i];j++) dp1[i][j] = dp1[i-1][j];
for(int j=price[i];j<=1100;j++) dp1[i][j] = std::max(dp1[i-1][j],dp1[i-1][j-price[i]]+value[i]);
}
//back->front
for(int i=cnt+1;i>=1;i--){
for(int j=0;j<price[i];j++) dp2[i][j] = dp2[i+1][j];
for(int j=price[i];j<=1100;j++) dp2[i][j] = std::max(dp2[i+1][j],dp2[i+1][j-price[i]]+value[i]);
}
scanf("%d",&q);
while(q--){
int erase,money;
scanf("%d%d",&erase,&money);
erase++;
int ans = 0;
for(int i=0;i<=money;i++) ans = std::max(ans,dp1[separate[erase]][i]+dp2[separate[erase+1]+1][money-i]);
// printf("DEBUG l:%d r:%d\n",separate[erase],separate[erase+1]+1);
printf("%d\n",ans);
}
return 0;
}