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;
#ifdef DEBUG
#define dbg(...) printf(__VA_ARGS__);
#define getchar_unlocked getchar
#else
#define dbg(...)
#endif
#define sf scanf
#define pf printf
#define fi first
#define se second
#define pb push_back
#define sz(x) (int)x.size()
#define mnto(x,y) x=min(x,(__typeof__(x))y)
#define mxto(x,y) x=max(x,(__typeof__(x))y)
#define INF 1023456789
#define LINF 1023456789123456789
#define all(x) x.begin(), x.end()
#define disc(x) sort(all(x));x.resize(unique(all(x))-x.begin());
typedef long long ll;
typedef long double ld;
typedef pair<int, int> ii;
typedef pair<ll,int> li;
typedef pair<ll, ll> pll;
typedef tuple<int, int, int> iii;
typedef tuple<int, int, int, int> iiii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<pll> vll;
mt19937 rng(time(0));
#define mod 1000000007
struct skywalk{
	int l,r,h;
};
#define maxn 100005
int n,m;
vector<ii> nodes,nodes2;
vector<skywalk> skywalks;
vector<int> add[maxn],rem[maxn];
ll dist[3000005];
priority_queue<li,vector<li>,greater<li>> pq;
vii AL[3000005];
void proc(int a,vi &h){
	vector<skywalk> tmp;
	vector<ii> pv,nx;
	pv.pb({h[a],a});
	nx.pb({h[a],a});
	for(int i=a-1;i>=0;--i){
		if(h[i]>pv.back().fi){
			pv.pb({h[i],i});
		}
	}
	for(int i=a+1;i<n;++i){
		if(h[i]>nx.back().fi){
			nx.pb({h[i],i});
		}
	}
	for(skywalk &sw:skywalks){
		if(sw.l<a&&a<sw.r){
			int p1=lower_bound(all(pv),ii(sw.h,-1))-pv.begin();
			int p2=lower_bound(all(nx),ii(sw.h,-1))-nx.begin();
			if(sw.l!=pv[p1].se)tmp.pb({sw.l,pv[p1].se,sw.h});
			if(pv[p1].se!=nx[p2].se)tmp.pb({pv[p1].se,nx[p2].se,sw.h});
			if(nx[p2].se!=sw.r)tmp.pb({nx[p2].se,sw.r,sw.h});
		}
		else tmp.pb(sw);
	}
	swap(tmp,skywalks);
}
ll min_distance(vi x,vi h,vi l,vi r,vi y,int s,int g){
	n=sz(x);m=sz(l);
	for(int i=0;i<m;++i){
		skywalks.pb({l[i],r[i],y[i]});
	}
	proc(s,h);proc(g,h);
	
	for(skywalk &sw:skywalks){
		add[sw.l].pb(sw.h);
		rem[sw.r].pb(sw.h);
	}
	
	multiset<int> ms;
	ms.insert(0);
	for(int i=0;i<n;++i){
		for(int j:add[i])ms.insert(j);
		for(int j:add[i]){
			nodes.pb({x[i],j});
			nodes.pb({x[i],*(--ms.lower_bound(j))});
		}
		for(int j:rem[i]){
			nodes.pb({x[i],j});
			nodes.pb({x[i],*(--ms.lower_bound(j))});
		}
		for(int j:rem[i])ms.erase(ms.find(j));
	}
	disc(nodes);
	
	for(ii pr:nodes)nodes2.pb({pr.se,pr.fi});
	sort(all(nodes2));
	
	for(int i=1;i<sz(nodes);++i){
		if(nodes[i-1].fi==nodes[i].fi){
			AL[i-1].pb({i,nodes[i].se-nodes[i-1].se});
			AL[i].pb({i-1,nodes[i].se-nodes[i-1].se});
		}
	}
	
	for(skywalk &sw:skywalks){
		int s=lower_bound(all(nodes2),ii(sw.h,x[sw.l]))-nodes2.begin();
		while(nodes2[s]!=ii(sw.h,x[sw.r])){
			ii p1={nodes2[s].se,nodes2[s].fi};
			ii p2={nodes2[s+1].se,nodes2[s+1].fi};
			int u=lower_bound(all(nodes),p1)-nodes.begin();
			int v=lower_bound(all(nodes),p2)-nodes.begin();
			int w=p2.fi-p1.fi;
			AL[u].pb({v,w});
			AL[v].pb({u,w});
			++s;
		}
	}
	
	for(int i=0;i<sz(nodes);++i)dist[i]=LINF;
	int src=lower_bound(all(nodes),ii(x[s],0))-nodes.begin();
	if(src==sz(nodes)||nodes[src]!=ii(x[s],0))return -1;
	dist[src]=0;pq.push({0,src});
	
	while(!pq.empty()){
		auto[d,u]=pq.top();
		pq.pop();
		for(auto[v,w]:AL[u]){
			if(dist[v]>dist[u]+w){
				dist[v]=dist[u]+w;
				pq.push({dist[v],v});
			}
		}
	}
	
	int f=lower_bound(all(nodes),ii(x[g],0))-nodes.begin();
	if(f==sz(nodes)||nodes[f]!=ii(x[g],0))return -1;
	ll ans=dist[f];
	if(ans==LINF)ans=-1;
	return ans;
}
| # | 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... |