Problem p03019 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
long long int n, x;
struct test {
  long long int b, l, u;
  bool operator<(const test &rhs) const {
    return l * b + u * (x - b) > rhs.l * rhs.b + rhs.u * (x - rhs.b);
  }
} T[100000];

int now = 0;

bool check(long long int s, long long int t) {
  long long int res = 0;
  for (int i = now; i < n; i++) {
    long long int tmp;
    if (s > T[i].b)
      tmp = T[i].l * T[i].b + (s - T[i].b) * T[i].u;
    else
      tmp = s * T[i].l;
    res = max(res, tmp);
  }
  return res >= t;
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> x;
  for (int i = 0; i < n; i++)
    cin >> T[i].b >> T[i].l >> T[i].u;
  long long int target = 0;
  for (int i = 0; i < n; i++)
    target += T[i].l * T[i].b;
  sort(T, T + n);
  while (target - ((T[now].l * T[now].b) + T[now].u * (x - T[now].b)) >= 0) {
    target -= ((T[now].l * T[now].b) + T[now].u * (x - T[now].b));
    now++;
  }
  if (now == n) {
    cout << n * x << endl;
    return 0;
  }
  long long int ans = n * x;
  int here = now - 1;
  for (int i = n - 1; i >= 0; i--) {
    long long int res = 0;
    if (i <= here) {
      target += ((T[i].l * T[i].b) + T[i].u * (x - T[i].b));
      if (i != here)
        target -= ((T[i + 1].l * T[i + 1].b) + T[i + 1].u * (x - T[i + 1].b));
    }
    while (target - ((T[now].l * T[now].b) + T[now].u * (x - T[now].b)) >= 0) {
      target -= ((T[now].l * T[now].b) + T[now].u * (x - T[now].b));
      now++;
    }
    if (i <= here)
      res = x * (now - 1);
    else
      res = x * now;
    long long int tmp = target;
    if (target <= T[i].l * T[i].b)
      res += target / T[i].l + ((target % T[i].l) ? 1 : 0);
    else {
      res += T[i].b;
      tmp -= T[i].l * T[i].b;
      res += tmp / T[i].u + ((tmp % T[i].u) ? 1 : 0);
    }
    ans = min(ans, res);
  }
  cout << ans << endl;

  /*while(now>0&&!(T[now]<T[now-1])&&!(T[now-1]<T[now]))
          now--;
  long long int L=0,R=x;
  while(L<R){
          long long int mid=(L+R)/2;
          if(check(mid,target))
                  R=mid;
          else
                  L=mid+1;
  }

  cout<<ans+L<<endl;*/
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
long long int n, x;
struct test {
  long long int b, l, u;
  bool operator<(const test &rhs) const {
    return l * b + u * (x - b) > rhs.l * rhs.b + rhs.u * (x - rhs.b);
  }
} T[100000];

int now = 0;

bool check(long long int s, long long int t) {
  long long int res = 0;
  for (int i = now; i < n; i++) {
    long long int tmp;
    if (s > T[i].b)
      tmp = T[i].l * T[i].b + (s - T[i].b) * T[i].u;
    else
      tmp = s * T[i].l;
    res = max(res, tmp);
  }
  return res >= t;
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> x;
  for (int i = 0; i < n; i++)
    cin >> T[i].b >> T[i].l >> T[i].u;
  long long int target = 0;
  for (int i = 0; i < n; i++)
    target += T[i].l * T[i].b;
  sort(T, T + n);
  while (target - ((T[now].l * T[now].b) + T[now].u * (x - T[now].b)) >= 0) {
    target -= ((T[now].l * T[now].b) + T[now].u * (x - T[now].b));
    now++;
  }
  if (now == n) {
    cout << n * x << endl;
    return 0;
  }
  long long int ans = n * x;
  int here = now - 1;
  for (int i = n - 1; i >= 0; i--) {
    long long int res = 0;
    if (i <= here) {
      target += ((T[i].l * T[i].b) + T[i].u * (x - T[i].b));
      if (i != here)
        target -= ((T[i + 1].l * T[i + 1].b) + T[i + 1].u * (x - T[i + 1].b));
    }
    while (now < n &&
           target - ((T[now].l * T[now].b) + T[now].u * (x - T[now].b)) >= 0) {
      target -= ((T[now].l * T[now].b) + T[now].u * (x - T[now].b));
      now++;
    }
    if (i <= here)
      res = x * (now - 1);
    else
      res = x * now;
    long long int tmp = target;
    if (target <= T[i].l * T[i].b)
      res += target / T[i].l + ((target % T[i].l) ? 1 : 0);
    else {
      res += T[i].b;
      tmp -= T[i].l * T[i].b;
      res += tmp / T[i].u + ((tmp % T[i].u) ? 1 : 0);
    }
    ans = min(ans, res);
  }
  cout << ans << endl;

  /*while(now>0&&!(T[now]<T[now-1])&&!(T[now-1]<T[now]))
          now--;
  long long int L=0,R=x;
  while(L<R){
          long long int mid=(L+R)/2;
          if(check(mid,target))
                  R=mid;
          else
                  L=mid+1;
  }

  cout<<ans+L<<endl;*/
}