#include "walk.h"
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define ull unsigned long long
#define ff first
#define ss second
#define pii pair<int,int>
#define pll pair<long long, long long>
#define vi vector<int>
#define vl vector<long long>
#define pb push_back
#define rep(i, b) for(int i = 0; i < (b); ++i)
#define rep2(i,a,b) for(int i = a; i <= (b); ++i)
#define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c)
#define count_bits(x) __builtin_popcountll((x))
#define all(x) (x).begin(),(x).end()
#define siz(x) (int)(x).size()
#define forall(it,x) for(auto& it:(x))
using namespace std;
const int INF = 1e9+50;
const ll INF_L = 1e18+40;
const ll MOD = 1e9+7;
struct point
{
	int y,ind,type;
};
vector<point> points_on[100001];
vector<pll> graph[1000001];
vector<pii> eq_y[100001];
vector<pii> eq_x[100001];
pii poz[1000001];
ll dist[1000001];
ll min_distance(vi x, vi h, vi l, vi r, vi y, int s, int g) 
{
	set<pii> points_graph;
	int n = siz(x);
	int m = siz(l);
	vi s_left(n);
	vi s_right(n);
	vi g_left(n);
	vi g_right(n);
	int sl = 0;
	int sr = 0;
	int gl = 0;
	int gr = 0;
	rep(i,n)
	{
		if(i >= s) sr = max(sr,h[i]);
		if(i >= g) gr = max(gr,h[i]);
		g_right[i] = gr;
		s_right[i] = sr;	
	}
	for(int i = n-1; i >= 0; i--)
	{
		if(i <= s) sl = max(sl,h[i]);
		if(i <= g) gl = max(gl,h[i]);
		s_left[i] = sl;
		g_left[i] = gl;
	}
	rep(i,m)
	{
		if(l[i] <= s && r[i] >= s)
		{
			if(h[s] >= y[i]) points_on[s].pb({y[i],i,2});
			int l2 = s;
			int r2 = r[i];
			int ans = 0;
			while(l2 <= r2)
			{
				int mid = (l2+r2)/2;
				if(s_right[mid] >= y[i])
				{
					ans = mid;
					r2 = mid-1;
				}
				else
				{
					l2 = mid+1;
				}
			}
			points_on[ans].pb({y[i],i,2});
			l2 = l[i];
			r2 = s;
			while(l2 <= r2)
			{
				int mid = (l2+r2)/2;
				if(s_left[mid] >= y[i])
				{
					ans = mid;
					l2 = mid+1;
				}
				else
				{
					r2 = mid-1;
				}
			}
			points_on[ans].pb({y[i],i,2});
		}
		if(l[i] <= g && r[i] >= g)
		{
			if(h[g] >= y[i]) points_on[g].pb({y[i],i,2});
			int l2 = g;
			int r2 = r[i];
			int ans = 0;
			while(l2 <= r2)
			{
				int mid = (l2+r2)/2;
				if(g_right[mid] >= y[i])
				{
					ans = mid;
					r2 = mid-1;
				}
				else
				{
					l2 = mid+1;
				}
			}
			points_on[ans].pb({y[i],i,2});
			l2 = l[i];
			r2 = g;
			while(l2 <= r2)
			{
				int mid = (l2+r2)/2;
				if(g_left[mid] >= y[i])
				{
					ans = mid;
					l2 = mid+1;
				}
				else
				{
					r2 = mid-1;
				}
			}
			points_on[ans].pb({y[i],i,2});	
		}
	}
	rep(i,m)
	{
		points_on[l[i]].pb({y[i],i,1});
		points_on[r[i]].pb({y[i],i,-1});
	}
	set<pii> cur_on;
	rep(i,n)
	{
		forall(it,points_on[i]) if(it.type == 1) cur_on.insert({it.y,it.ind});
		forall(it,points_on[i])
		{
			points_graph.insert({i,it.ind});
			auto nxt = cur_on.upper_bound({it.y,it.ind});
			if(nxt != cur_on.end() && y[(*nxt).ss] <= h[i])
			{
				points_graph.insert({i,(*nxt).ss});
			}
			nxt = cur_on.lower_bound({it.y,it.ind});
			if(nxt != cur_on.begin())
			{
				nxt--;
				points_graph.insert({i,(*nxt).ss});
			}
		}
		forall(it,points_on[i]) if(it.type == -1) cur_on.erase(cur_on.find({it.y,it.ind}));
	}
	int cur = 0;
	forall(it,points_graph)
	{
		poz[cur] = it;
		eq_y[it.ss].pb({it.ff,cur});
		eq_x[it.ff].pb({y[it.ss],cur});
		cur++;
	}	
	rep(i,n)
	{
		sort(all(eq_x[i]));
		pii pop = {-1,-1};
		forall(it,eq_x[i])
		{
			if(pop.ff != -1)
			{
				graph[pop.ss].pb({it.ss,abs(it.ff-pop.ff)});
				graph[it.ss].pb({pop.ss,abs(it.ff-pop.ff)});
			}
			pop = it;
		}
	}
	rep(i,m)
	{
		sort(all(eq_y[i]));
		pii pop = {-1,-1};
		forall(it,eq_y[i])
		{
			if(pop.ff != -1)
			{
				graph[pop.ss].pb({it.ss,abs(x[it.ff]-x[pop.ff])});
				graph[it.ss].pb({pop.ss,abs(x[it.ff]-x[pop.ff])});
			}
			pop = it;
		}
	}
	rep(i,cur) dist[i] = 1e18;
	priority_queue<pll,vector<pll>,greater<pll>> pq;
	rep(i,cur)
	{
		if(poz[i].ff == s) pq.push({y[poz[i].ss],i});
	}
	while(!pq.empty())
	{
		pll t = pq.top();
		pq.pop();
		if(t.ff >= dist[t.ss]) continue;
		dist[t.ss] = t.ff;
		forall(it,graph[t.ss]) pq.push({t.ff+it.ss,it.ff});
	}
	ll ans = 1e18;
	rep(i,cur) if(poz[i].ff == g) ans = min(ans,dist[i]+y[poz[i].ss]);
	if(ans == 1e18) 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... |