#include "railroad.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INF = numeric_limits<ll>::max();
// int main() {
//     int n;
//     assert(1 == scanf("%d", &n));
//     std::vector<int> s(n), t(n);
//     for (int i = 0; i < n; ++i)
//         assert(2 == scanf("%d%d", &s[i], &t[i]));
//     long long ans = plan_roller_coaster(s, t);
//     printf("%lld\n", ans);
//     return 0;
// }
void build(int n, vector<int> &in, int &len, vector<int> &seg) {
    len = 2 << __lg(n);
    seg.resize(2*len,INF);
    for (int i{0};i<n;i++) {
        seg[len+i] = in[i];
    }
    for (int i{len-1};i>=1;i--) {
        seg[i] = min(seg[2*i],seg[2*i+1]);
    }
}
void update(int &len, vector<int> &seg,int i, int v) {
    i += len;
    seg[i] = v;
    for (i/=2;i>=1;i/=2) {
        seg[i] = min(seg[2*i],seg[2*i+1]);
    }
}
int fmin(int &len, vector<int> &seg) {
    int i = 1;
    while (i < len) {
        if (seg[2*i] < seg[2*i + 1]) {
            i = 2*i;
        }
        else {
            i = 2*i + 1;
        }
    }
    return i - len;
}
long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) {
    int n = (int) s.size()+1;
    s.push_back(INF);
    t.push_back(0);
    int len1{};
    int len2{};
    vector<int> seg1{};
    vector<int> seg2{};
    build(n,s,len1,seg1);
    build(n,t,len2,seg2);
    ll out = 0;
    for (int i{1};i<n;++i) {
        // cout << s[i] << " " << t[i] << "\n";
        int a = fmin(len1,seg1);
        update(len1,seg1,a,INF);
        update(len2,seg2,a,INF);
        int b = fmin(len2,seg2);
        out += max(0,t[b]-s[a]);
        update(len2,seg2,b,t[a]);
        t[b] = t[a];
        s[a] = INF;
        t[a] = INF;
    }
    return out;
}
Compilation message (stderr)
railroad.cpp: In function 'void build(int, std::vector<int>&, int&, std::vector<int>&)':
railroad.cpp:20:22: warning: overflow in conversion from 'long long int' to 'std::vector<int>::value_type' {aka 'int'} changes value from '9223372036854775807' to '-1' [-Woverflow]
   20 |     seg.resize(2*len,INF);
      |                      ^~~
railroad.cpp: In function 'long long int plan_roller_coaster(std::vector<int>, std::vector<int>)':
railroad.cpp:52:17: warning: overflow in conversion from 'long long int' to 'std::vector<int>::value_type' {aka 'int'} changes value from '9223372036854775807' to '-1' [-Woverflow]
   52 |     s.push_back(INF);
      |                 ^~~
railroad.cpp:66:28: warning: overflow in conversion from 'long long int' to 'int' changes value from '9223372036854775807' to '-1' [-Woverflow]
   66 |         update(len1,seg1,a,INF);
      |                            ^~~
railroad.cpp:67:28: warning: overflow in conversion from 'long long int' to 'int' changes value from '9223372036854775807' to '-1' [-Woverflow]
   67 |         update(len2,seg2,a,INF);
      |                            ^~~
railroad.cpp:72:16: warning: overflow in conversion from 'long long int' to '__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type' {aka 'int'} changes value from '9223372036854775807' to '-1' [-Woverflow]
   72 |         s[a] = INF;
      |                ^~~
railroad.cpp:73:16: warning: overflow in conversion from 'long long int' to '__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type' {aka 'int'} changes value from '9223372036854775807' to '-1' [-Woverflow]
   73 |         t[a] = INF;
      |                ^~~
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... |