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 "walk.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int MAXN = 1e5;
const ll INF = 1e15;
struct Build
{
	int X, H;
};
struct Line
{
	int L, R, Y;
};
int N, M, S, E;
Build A[MAXN+10];
Line B[MAXN+10];
struct Queue
{
	int u; ll w;
	bool operator < (const Queue &p) const
	{
		return w>p.w;
	}
};
struct SEG
{
	int tree[MAXN*4+10];
	void update(int node, int tl, int tr, int l, int r, int k)
	{
		if(tree[node]!=0 && tl!=tr)
		{
			tree[node*2]=tree[node];
			tree[node*2+1]=tree[node];
			tree[node]=0;
		}
		if(l<=tl && tr<=r) { tree[node]=k; return; }
		if(r<tl || tr<l) return;
		int mid=tl+tr>>1;
		update(node*2, tl, mid, l, r, k);
		update(node*2+1, mid+1, tr, l, r, k);
	}
	int query(int node, int tl, int tr, int p)
	{
		if(tree[node]!=0 && tl!=tr)
		{
			tree[node*2]=tree[node];
			tree[node*2+1]=tree[node];
			tree[node]=0;
		}
		if(tl==tr) return tree[node];
		int mid=tl+tr>>1;
		if(p<=mid) return query(node*2, tl, mid, p);
		else return query(node*2+1, mid+1, tr, p);
	}
}seg;
vector<pll> adj[MAXN+10];
ll dist[MAXN+10];
ll min_distance(vector<int> _X, vector<int> _H, vector<int> _L, vector<int> _R, vector<int> _Y, int _S, int _E)
{
	N=_X.size(); M=_L.size();
	for(int i=0; i<N; i++) A[i+1]={_X[i], _H[i]};
	for(int i=0; i<M; i++) B[i+1]={_L[i]+1, _R[i]+1, _Y[i]};
	S=_S+1; E=_E+1;
	
	B[M+1]={S, S, 0};
	B[M+2]={E, E, 0};
	sort(B+1, B+M+3, [&](const Line &p, const Line &q)
	{
		return p.Y<q.Y;
	});
	for(int i=1; i<=M+2; i++)
	{
		int u=seg.query(1, 1, N, B[i].L);
		if(u)
		{
			adj[u].push_back({i, B[i].Y-B[u].Y});
			adj[i].push_back({u, B[i].Y-B[u].Y});
		}
		u=seg.query(1, 1, N, B[i].R);
		if(u)
		{
			adj[u].push_back({i, B[i].Y-B[u].Y});
			adj[i].push_back({u, B[i].Y-B[u].Y});
		}
		seg.update(1, 1, N, B[i].L, B[i].R, i);
	}
	for(int i=1; i<=M+2; i++) dist[i]=INF;
	priority_queue<Queue> PQ;
	PQ.push({1, 0});
	while(!PQ.empty())
	{
		Queue now=PQ.top(); PQ.pop();
		if(dist[now.u]<=now.w) continue;
		dist[now.u]=now.w;
		for(auto nxt : adj[now.u])
		{
			PQ.push({nxt.first, nxt.second+now.w});
		}
	}
	if(dist[2]==INF) return -1;
	return dist[2]+A[N].X-A[1].X;
}
Compilation message (stderr)
walk.cpp: In member function 'void SEG::update(int, int, int, int, int, int)':
walk.cpp:48:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   48 |   int mid=tl+tr>>1;
      |           ~~^~~
walk.cpp: In member function 'int SEG::query(int, int, int, int)':
walk.cpp:61:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   61 |   int mid=tl+tr>>1;
      |           ~~^~~
walk.cpp: In function 'll min_distance(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, int, int)':
walk.cpp:112:17: warning: narrowing conversion of 'nxt.std::pair<long long int, long long int>::first' from 'long long int' to 'int' [-Wnarrowing]
  112 |    PQ.push({nxt.first, nxt.second+now.w});
      |             ~~~~^~~~~| # | 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... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |