This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
#include <cmath>
using ll = long long;
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) < (b)) ? (b) : (a))
int const nmax = 100000;
ll const inf = 1LL * 1000000000 * nmax * 10;
class SegmentTree{
private:
  struct Node{
    ll number;
    Node* left;
    Node* right;
    Node(ll val){
      number = val;
      left = right = nullptr;
    }
  };
  Node* root = nullptr;
  void computenode(Node* &root){
    if(root->left == nullptr && root->right == nullptr)
      root->number = inf;
    else if(root->left == nullptr)
      root->number = root->right->number;
    else if(root->right == nullptr)
      root->number = root->left->number;
    else
      root->number = std::min(root->left->number, root->right->number);
  }
  void _update(Node* &root, int from, int to, int x, ll val){
    if(root == nullptr)
      root = new Node(val);
    if(from < to){
      int mid = (from + to) / 2;
      if(x <= mid)
        _update(root->left, from, mid, x, val);
      else if(mid + 1 <= x)
        _update(root->right, mid + 1, to, x, val);
      computenode(root);
    } else
      root->number = std::min(root->number, val);
  }
  ll _query(Node* &root, int from, int to, int x, int y){
    if(root == nullptr)
      return inf;
    if(from == x && to == y)
      return root->number;
    else {
      int mid = (from + to) / 2;
      if(x <= mid && y <= mid)
        return _query(root->left, from, mid, x, y);
      else if(mid + 1 <= x && mid + 1 <= y)
        return _query(root->right, mid + 1, to, x, y);
      else
        return std::min(_query(root->left, from, mid, x, mid), _query(root->right, mid + 1, to, mid + 1, y));
    }
  }
public:
  void update(int from, int to, int x, ll val){
    _update(root, from, to, x, val);
  }
  ll query(int from, int to, int x, int y){
    return _query(root, from, to, x, y);
  }
};
int main()
{
  int n, lim;
  std::cin >> n >> lim;
  SegmentTree aint1, aint2;
  aint1.update(1, lim, 1, 0);
  aint2.update(1, lim, lim, 0);
  ll result = inf;
  for(int i = 1;i <= n; i++){
    int from, mid, to, cost;
    std::cin >> from >> to >> mid >> cost;
    ll result1 = aint1.query(1, lim, from, to);
    ll result2 = aint2.query(1, lim, from, to);
    aint1.update(1, lim, mid, result1 + cost);
    aint2.update(1, lim, mid, result2 + cost);
    result = std::min(result, result1 + result2 + cost);
  }
  if(result == inf)
    std::cout << -1;
  else
    std::cout << result;
  return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |