#include "railroad.h"
#include<iostream>
#include<vector>
#include<queue>
#include<deque>
#include<string>
#include<fstream>
#include<algorithm>
#include <iomanip>
#include<map>
#include <set>
#include <unordered_map>
#include <stack>
#include <unordered_set>
#include <cmath>
#include <cstdint>
#include <cassert>
#include <bitset>
#include <random>
#include <chrono>
#include <cstring>
#define shit short int
#define ll long long
#define ld long double
//#define int ll
#define For(i, n) for(int i = 0; i < (int)n; i++)
#define ffor(i, a, n) for(int i = (int)a; i < (int)n; i++)
#define rfor(i, n) for(int i = (int)n; i >= (int)0; i--)
#define rffor(i, a, n) for(int i = (int)n; i >= (int)a; i--)
#define vec vector
#define ff first
#define ss second
#define pb push_back
#define pii pair<int, int>
#define pld pair<ld, ld>
#define NEK 2000000000000000
#define mod 1000000007
#define mod2 1000000009
#define rsz resize 
#define prv 43
#define prv2 47
#define D 8
#define trav(a,x) for (auto& a: x)
#define pb push_back
#define ub upper_bound
#define lb lower_bound
#define all(x) (x).begin(), (x).end()
#define sig 0.0000001
using namespace std;
ll pomale(vec<int>&s, vec<int>&t) {
    int n = s.size();
    vec<vec<ll>> dp((1 << n), vec<ll>(n, NEK));
    For(i, n) {
        dp[(1<<i)][i] = 0;
    }
    ffor(i, 1, (1<<n)) {
        For(j, n) {
            if (!((1 << j) & i)) continue;
            For(k, n) {
                if (k == j) continue;
                if (!((1 << k) & i)) continue;
                dp[i][j] = min(dp[i][j], dp[i - (1 << j)][k] + max((ll)0, (ll)t[k] - (ll)s[j]));
            }
        }
    }
    ll mini = NEK;
    For(i, n) {
        mini = min(mini, dp[(1 << n) - 1][i]);
    }
    return mini;
}
ll rychle(vec<int>& s, vec<int>& t) {
    //vsetko parne
    map<int, int> umap;
    int n = s.size();
    int mini = 0;
    For(i, n) {
        umap[s[i]]--;
        umap[t[i]]++;
        mini = min(mini, s[i]);
        mini = min(mini, t[i]);
    }
    int zdola = 0;
    bool zle = 0;
    for (auto i : umap) {
        int hod = i.ss + zdola;
        if (hod < 0) {
            zle = 1;
            break;
        }
        zdola = hod;
    }
    if (zdola != 0) zle = 1;
    if (zle == 0) {
        return 0;
    }
    zle = 0;
    zdola = umap[mini];
    if (zdola < 0) return 1;
    zdola++;
    int prvy = 0;
    for (auto i : umap) {
        if (prvy == 0) {
            prvy = 1;
            continue;
        }
        int hod = i.ss + zdola;
        if (hod < 0) {
            zle = 1;
            break;
        }
        zdola = hod;
    }
    if (zdola != 1) zle = 1;
    if (zle == 0) {
        return 0;
    }
    return 1;
}
long long plan_roller_coaster(vector<int> s, vector<int> t) {
    int n = s.size();
    if (n <= 16) return pomale(s, t);
    return rychle(s, t);
}
/*
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n; cin >> n;
    vec<int> s(n), t(n);
    For(i, n) {
        cin >> s[i] >> t[i];
    }
    cout << plan_roller_coaster(s, t) << '\n';
    return 0;
}*/
Compilation message (stderr)
railroad.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
railroad_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~| # | 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... |