Submission #795747

# Submission time Handle Problem Language Result Execution time Memory
795747 2023-07-27T14:09:39 Z denniskim Railway Trip 2 (JOI22_ho_t4) C++17
0 / 100
426 ms 91676 KB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef __int128 lll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pld;
#define MAX 9223372036854775807LL
#define MIN -9223372036854775807LL
#define INF 0x3f3f3f3f3f3f3f3f
#define fi first
#define se second
#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cout << fixed; cout.precision(10);
#define sp << " "
#define en << "\n"
#define compress(v) sort(v.begin(), v.end()), v.erase(unique(v.begin(), v.end()), v.end())

ll n, K;
ll m;
ll q;
pll a[200010];
ll L, R;
pll b[200010];
ll Lspa[200010][21];
ll Rspa[200010][21];

struct segtree
{
	pll seg[1000010][2];
	pll lazy[1000010][2];
	
	void init(ll no, ll s, ll e)
	{
		lazy[no][0] = {-INF, 0};
		lazy[no][1] = {INF, 0};
		seg[no][0] = {-INF, 0};
		seg[no][1] = {INF, 0};
		
		if(s == e)
			return;
		
		init(no << 1, s, (s + e) >> 1);
		init(no << 1 | 1, ((s + e) >> 1) + 1, e);
		
		//hmm...?
	}
	
	void prop(ll no, ll s, ll e)
	{
		if(lazy[no][0].se != 0)
		{
			if(seg[no][0].fi < lazy[no][0].fi)
				seg[no][0] = lazy[no][0];
			
			if(s != e)
			{
				if(lazy[no << 1][0].fi < lazy[no][0].fi)
					lazy[no << 1][0] = lazy[no][0];
				
				if(lazy[no << 1 | 1][0].fi < lazy[no][0].fi)
					lazy[no << 1 | 1][0] = lazy[no][0];
			}
			
			lazy[no][0] = {-INF, 0};
		}
		
		if(lazy[no][1].se != 0)
		{
			if(seg[no][1].fi > lazy[no][1].fi)
				seg[no][1] = lazy[no][1];
			
			if(s != e)
			{
				if(lazy[no << 1][1].fi > lazy[no][1].fi)
					lazy[no << 1][1] = lazy[no][1];
				
				if(lazy[no << 1 | 1][1].fi > lazy[no][1].fi)
					lazy[no << 1 | 1][1] = lazy[no][1];
			}
			
			lazy[no][1] = {INF, 0};
		}
	}
	
	void update(ll no, ll s, ll e, ll l, ll r, ll v1, ll v2)
	{
		prop(no, s, e);
		
		if(e < l || r < s)
			return;
		
		if(l <= s && e <= r)
		{
			lazy[no][0] = lazy[no][1] = {v1, v2};
			prop(no, s, e);
			return;
		}
		
		update(no << 1, s, (s + e) >> 1, l, r, v1, v2);
		update(no << 1 | 1, ((s + e) >> 1) + 1, e, l, r, v1, v2);
		
		if(seg[no << 1][0].fi < seg[no << 1 | 1][0].fi)
			seg[no][0] = seg[no << 1 | 1][0];
		else
			seg[no][0] = seg[no << 1][0];
		
		if(seg[no << 1][1].fi > seg[no << 1 | 1][0].fi)
			seg[no][1] = seg[no << 1 | 1][1];
		else
			seg[no][1] = seg[no << 1][1];
	}
	
	pair<pll, pll> query(ll no, ll s, ll e, ll l, ll r)
	{
		prop(no, s, e);
		
		if(e < l || r < s)
			return {{-INF, 0}, {INF, 0}};
		
		if(l <= s && e <= r)
			return {seg[no][0], seg[no][1]};
		
		pair<pll, pll> LL = query(no << 1, s, (s + e) >> 1, l, r);
		pair<pll, pll> RR = query(no << 1 | 1, ((s + e) >> 1) + 1, e, l, r);
		pair<pll, pll> ret;
		
		if(LL.fi.fi > RR.fi.fi)
			ret.fi = LL.fi;
		else
			ret.fi = RR.fi;
		
		if(LL.se.fi < RR.se.fi)
			ret.se = LL.se;
		else
			ret.se = RR.se;
		
		return ret;
	}
}segt;

void RR(void)
{
	ll cc = 0;
	
	for(ll i = 1 ; i <= m ; i++)
	{
		if(a[i].fi < a[i].se)
			b[cc++] = {a[i].fi, i};
	}
	
	sort(b, b + cc);
	
	if(!cc)
		return;
	
	segt.init(1, 1, n);
	
	ll num = b[cc - 1].se;
	
	segt.update(1, 1, n, a[num].fi, min(a[num].se, a[num].fi + K - 1), a[num].se, num);
	
	for(ll i = cc - 2 ; i >= 0 ; i--)
	{
		num = b[i].se;
		
		pair<pll, pll> qry = segt.query(1, 1, n, a[num].fi, a[num].se);
		
		if(qry.fi.se)
			Rspa[num][0] = qry.fi.se;
		
		segt.update(1, 1, n, a[num].fi, min(a[num].se, a[num].fi + K - 1), a[num].se, num);
	}
}

void LL(void)
{
	ll cc = 0;
	
	for(ll i = 1 ; i <= m ; i++)
	{
		if(a[i].fi > a[i].se)
			b[cc++] = {a[i].fi, i};
	}
	
	sort(b, b + cc);
	reverse(b, b + cc);
	
	if(!cc)
		return;
	
	segt.init(1, 1, n);
	
	ll num = b[cc - 1].se;
	
	segt.update(1, 1, n, a[num].se, max(a[num].fi, a[num].se - K + 1), a[num].fi, num);
	
	for(ll i = cc - 2 ; i >= 0 ; i--)
	{
		num = b[i].se;
		
		pair<pll, pll> qry = segt.query(1, 1, n, a[num].se, a[num].fi);
		
		if(qry.se.se)
			Lspa[num][0] = qry.se.se;
		
		segt.update(1, 1, n, a[num].se, max(a[num].fi, a[num].se - K + 1), a[num].fi, num);
	}
}

int main(void)
{
	fastio
	
	cin >> n >> K;
	cin >> m;
	
	for(ll i = 1 ; i <= m ; i++)
		cin >> a[i].fi >> a[i].se;
	
	LL();
	RR();

	for(ll i = 1 ; i <= m ; i++)
	{
		if(!Lspa[i][0])
			Lspa[i][0] = i;

		if(!Rspa[i][0])
			Rspa[i][0] = i;
	}

	for(ll i = 1 ; i <= 20 ; i++)
	{
		for(ll j = 1 ; j <= m ; j++)
			Rspa[j][i] = Rspa[Rspa[j][i - 1]][i - 1];
	}

	cin >> q;

	while(q--)
	{
		cin >> L >> R;

		pair<pll, pll> num = segt.query(1, 1, n, L, L);

		if(!num.fi.se)
		{
			cout << -1 en;
			continue;
		}

		if(num.fi.fi >= R)
		{
			cout << 1 en;
			continue;
		}

		ll ans = 1;

		for(ll i = 20 ; i >= 0 ; i--)
		{
			if(a[Rspa[num.fi.se][i]].se < R)
			{
				ans += (1LL << i);
				num.fi.se = Rspa[num.fi.se][i];
			}
		}

		if(a[Rspa[num.fi.se][0]].se < R)
		{
			cout << -1 en;
			continue;
		}

		cout << ans + 1 en;
	}
}
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 468 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 468 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 106 ms 46464 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 175 ms 46364 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 415 ms 91672 KB Output is correct
2 Correct 190 ms 54732 KB Output is correct
3 Correct 115 ms 36132 KB Output is correct
4 Correct 66 ms 24860 KB Output is correct
5 Correct 43 ms 19272 KB Output is correct
6 Correct 38 ms 17796 KB Output is correct
7 Correct 140 ms 54692 KB Output is correct
8 Correct 1 ms 468 KB Output is correct
9 Correct 4 ms 1364 KB Output is correct
10 Correct 352 ms 90956 KB Output is correct
11 Incorrect 426 ms 91676 KB Output isn't correct
12 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 468 KB Output isn't correct
2 Halted 0 ms 0 KB -