WA 345
#include<bits/stdc++.h>
using namespace std;
int n,otim=1e9+7;
int ans,cnt;
struct node{
int t,m,p,s;
bool operator <(const node &x)const{
return s<x.s;
}
}l;
vector<node> q;
queue<node> p;
bool work_in(int x){
if(q.empty()||q[0].s>=l.m){
l.s=0;
l.t=x;
q.push_back(l);
sort(q.begin(),q.end());
return 1;
}
for(int i=1;i<q.size();i++){
if(q[i].s-q[i-1].s-q[i-1].m>=l.m){
l.s=q[i-1].s+q[i-1].m;
l.t=x;
q.push_back(l);
sort(q.begin(),q.end());
return 1;
}
}
if(n-q.back().s-q.back().m>=l.m){
l.s=q.back().s+q.back().m;
l.t=x;
q.push_back(l);
sort(q.begin(),q.end());
return 1;
}
return 0;
}
void work_out(){
vector<node> new_q;
for(auto x:q){
if(x.t+x.p>otim) new_q.push_back(x);
}
q=new_q;
sort(q.begin(),q.end());
int nw=1e9+7;
while(!p.empty()){
l=p.front();
if(work_in(otim)){
nw=min(nw,l.t+l.p);
p.pop();
}
else break;
}
for(auto x:q){
nw=min(nw,x.t+x.p);
}
otim=nw;
}
void work(int t,int m,int pp){
if(t>=otim) work_out();
l.t=t,l.m=m,l.p=pp;
if(work_in(t)) {
otim=min(otim,l.t+l.p);
// cout<<t<<' '<<m<<' '<<pp<<'\n';
}
else p.push(l),cnt++;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
int t,m,pp;
while(cin>>t>>m>>pp&&(m!=0)){
work(t,m,pp);
}
while(!p.empty()) work_out();
int ans=otim;
for(auto [t,m,pp,s]:q){
ans=max(ans,t+pp);
}
cout<<ans<<'\n'<<cnt;
return 0;
}