l+r+c 相同的列车才能一起
mp[i][j] 表示l+r+c=i && l=j的最大权的位置
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
const int N=1e5+100;
struct P{
int v,c,l,r,s;
}p[N];
int sta[N],top;
int sta1[N],top1;
map<int,int> mp[N];
int pre[N];
int main(){
#ifdef DouBi
freopen("in.cpp","r",stdin);
#endif // DouBi
int n;
while(scanf("%d",&n)!=EOF){
top=0;
for(int i=1;i<=n;i++){
scanf("%d%d%d%d",&p[i].v,&p[i].c,&p[i].l,&p[i].r);
p[i].s=p[i].c+p[i].l+p[i].r;
sta[top++]=p[i].s;
}
p[n+1].v=0;p[0].v=0;
sort(sta,sta+top);
top=unique(sta,sta+top)-sta;
for(int i=0;i<top;i++){
mp[i].clear();mp[i][0]=n+1;
}
int ans=n+1;
for(int i=1;i<=n;i++){
int id=lower_bound(sta,sta+top,p[i].s)-sta;
int x=mp[id][p[i].l];
if(x){
pre[i]=x;
p[i].v+=p[x].v;
if(p[i].r==0){
if(p[i].v>p[ans].v){
ans=i;
}
}
int y=mp[id][p[i].l+p[i].c];
if(p[i].v>p[y].v){
mp[id][p[i].l+p[i].c]=i;
}
}
}
int top1=0;
while(ans!=n+1){
sta1[top1++]=ans;
ans=pre[ans];
}
printf("%d\n",top1);
for(int i=top1-1;i>=0;i--){
printf("%d",sta1[i]);
if(i>0)printf(" ");
else printf("\n");
}
}
return 0;
}