1.分段搞一下就好了
2.CDQ应该也可以过吧,懒得写了
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#define N 4010
#define For(i,x,y) for (i=x;i<=y;i++)
using namespace std;
struct ww {
int c,h,t,id;
} a[N];
int i,j,k,n,m,p;
int f[N][N],g[N][N];
inline bool cc1(const ww &a,const ww &b) {
return a.t<b.t;
}
int main() {
scanf("%d%d",&n,&p);
For(i,1,n) {
scanf("%d%d%d",&a[i].c,&a[i].h,&a[i].t);
a[i].id=a[i].t/p;
}
sort(a+1,a+n+1,cc1);
For(i,1,n) if (a[i].id>a[i-1].id)
For(j,a[i].c,N-1) f[i][j]=a[i].h;
else {
memcpy(f[i],f[i-1],sizeof(f[i]));
for (j=N-1;j>=a[i].c;j--)
f[i][j]=max(f[i][j],f[i-1][j-a[i].c]+a[i].h);
}
for (i=n;i;i--) if (i==n||a[i].id<a[i+1].id)
For(j,a[i].c,N-1) g[i][j]=a[i].h;
else {
memcpy(g[i],g[i+1],sizeof(g[i]));
for (j=N-1;j>=a[i].c;j--)
g[i][j]=max(g[i][j],g[i+1][j-a[i].c]+a[i].h);
}
scanf("%d",&m);
For(i,1,m) {
int x,y,l=0,r=0,an=0;
scanf("%d%d",&x,&y);
For(j,1,n) if (a[j].t<=x&&a[j].t+p>x) {
if (!l) l=j;
r=j;
}
if (a[l].id==a[r].id) {
if (r<n&&a[r+1].id==a[r].id) l=0;
else r=0;
}
For(j,0,y) an=max(an,f[r][j]+g[l][y-j]);
printf("%d\n",an);
}
return 0;
}