#include "overtaking.h"
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
const ll INF = 2e18;
ll sh;
struct tree {
	ll val, L, R, mid;
	tree *lef, *rig;
	
	tree(ll x,ll y) {
		val = 0;
		L = x; R = y;
		mid = (L+R)/2;
		lef = rig = 0;
	}
	
	ll query(ll x) {
		ll ans = max(x,val);
		if (x <= mid && lef) {
			ans = max(ans,lef->query(x));
		}
		if (x > mid && rig) {
			ans = max(ans,rig->query(x));
		}
		return ans;
	}
	
	void push() {
		if (!lef) {
			lef = new tree(L,mid);
			rig = new tree(mid+1,R);
		}
	}
	
	void update(ll x,ll y,ll z) {
		if (x <= L && y >= R) {
			val = z;
			lef = rig = 0;
			return;
		}
		if (x > R || y < L) {
			return;
		}
		push();
		lef->update(x,y,z);
		rig->update(x,y,z);
	}
} root(1,INF);
void init(int L,int N,vector<ll>T,vector<int>W,int X,int M,vector<int>S) {
	sh = (ll)X*L;
	vector <pii> V;
	for (int i=0;i<N;i++) {
		if (W[i] > X) {
			V.push_back({T[i]+sh,W[i]-X});
		}
	}
	N = V.size();
	if (!N) {
		return;
	}
	vector <pii> U;
	for (int i=1;i<M;i++) {
		int s = S[i]-S[i-1];
		sort(V.begin(),V.end());
		for (int i=0;i<N;i++) {
			V[i].fi += V[i].se*s;
		}
		for (int i=1;i<N;i++) {
			V[i].fi = max(V[i].fi,V[i-1].fi);
		}
		for (int i=N-1;i>=0;i--) {
			U.push_back({V[i].fi-V[i].se*s,V[i].fi});
		}
	}
	reverse(U.begin(),U.end());
	for (pii u : U) {
		root.update(u.fi+1,u.se-1,root.query(u.se));
	}
}
long long arrival_time(ll Y) {
	return root.query(Y+sh);
}
| # | 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... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |