Submission #718905

#TimeUsernameProblemLanguageResultExecution timeMemory
718905vinnipuh01Railway Trip 2 (JOI22_ho_t4)C++17
100 / 100
1971 ms75384 KiB
#include <iostream>
#include <bits/stdc++.h>
#include <cmath>
#include <algorithm>
#include <vector>
#include <deque>
#include <set>
#include <stack>
#include <string>
#include <map>
#include <queue>
#define sqrt sqrtl
 
using namespace std;
 
const long long oo = 1e9;
 
int sum, ans = 0, mx = 0, mn = 1000000000, num, pos;
 
 
/*
    ViHHiPuh
 
   (( `'-""``""-'` ))
     )-__-_.._-__-(
   / --- (o _ o) --- \
   \ .-* ( .0. ) *-. /
   _'-. ,_ '=' _, .-'_
  / `;#'#'# - #'#'#;` \
 \_)) -----'#'----- ((_/
      # --------- #
  '# ------- ------ #'
  /..-'# ------- #'-.\
  _\...-\'# -- #'/-.../_
  ((____)- '#' -(____))
 
 
    cout << fixed << setprecision(6) << x;
 
 
    freopen ( "sum.in", "r", stdin )
*/
 
int n, m, q, k, a[ 200001 ], b[ 200001 ], s[ 50001 ], f[ 50001 ];
 
struct Node {
	int mx, mn;
	
	void clear(  ) {
		mx = 0;
		mn = n + 1;
	}
	
} t[ 20 ][ 400001 ], p[ 20 ][ 400001 ], an;
 
vector <int> v[ 2001 ];
 
void build( int v, int tl, int tr ) {
	p[ pos ][ v ].mn = n + 1;
	if ( tl == tr ) {
		t[ pos ][ v ].mx = tl;
		t[ pos ][ v ].mn = tl;
		return;
	}
	int mid = ( tl + tr ) / 2;
	build( v + v, tl, mid );
	build( v + v + 1, mid + 1, tr );
	t[ pos ][ v ].mx = max( t[ pos ][ v + v ].mx, t[ pos ][ v + v + 1 ].mx );
	t[ pos ][ v ].mn = min( t[ pos ][ v + v ].mn, t[ pos ][ v + v + 1 ].mn );
}
 
void pus( int v ) {
	if ( p[ pos ][ v ].mx ) {
		p[ pos ][ v + v ].mx = max( p[ pos ][ v + v ].mx, p[ pos ][ v ].mx );
		p[ pos ][ v + v + 1 ].mx = max( p[ pos ][ v + v + 1 ].mx, p[ pos ][ v ].mx );
		t[ pos ][ v + v ].mx = max( t[ pos ][ v + v ].mx, p[ pos ][ v ].mx );
		t[ pos ][ v + v + 1 ].mx = max( t[ pos ][ v + v + 1 ].mx, p[ pos ][ v ].mx );
		p[ pos ][ v ].mx = 0;
	}
	if ( p[ pos ][ v ].mn != n + 1 ) {
		p[ pos ][ v + v ].mn = min( p[ pos ][ v + v ].mn, p[ pos ][ v ].mn );
		p[ pos ][ v + v + 1 ].mn= min( p[ pos ][ v + v + 1 ].mn, p[ pos ][ v ].mn );
		t[ pos ][ v + v ].mn = min( t[ pos ][ v + v ].mn, p[ pos ][ v ].mn );
		t[ pos ][ v + v + 1 ].mn = min( t[ pos ][ v + v + 1 ].mn, p[ pos ][ v ].mn );
		p[ pos ][ v ].mn = n + 1;
	}
}
 
void upd( int v, int tl, int tr, int l, int r ) {
	if ( tl > r || tr < l )
		return;
	if ( tl >= l && tr <= r ) {
//		cout << tl << " " << tr << " x- " << num << "\n";
		t[ pos ][ v ].mx = max( t[ pos ][ v ].mx, num );
		p[ pos ][ v ].mx = max( p[ pos ][ v ].mx, num );
		return;
	}
	pus( v );
	int mid = ( tl + tr ) / 2;
	upd( v + v, tl, mid, l, r );
	upd( v + v + 1, mid + 1, tr, l, r );
	t[ pos ][ v ].mx = max( t[ pos ][ v + v ].mx, t[ pos ][ v + v + 1 ].mx ); 
}
 
void updd( int v, int tl, int tr, int l, int r ) {
	if ( tl > r || tr < l )
		return;
	if ( tl >= l && tr <= r ) {
//		cout << tl << " " << tr << " n- " << num << "\n";
		t[ pos ][ v ].mn = min( t[ pos ][ v ].mn, num );
		p[ pos ][ v ].mn = min( p[ pos ][ v ].mn, num );
		return;
	}
	pus( v );
	int mid = ( tl + tr ) / 2;
	updd( v + v, tl, mid, l, r );
	updd( v + v + 1, mid + 1, tr, l, r );
	t[ pos ][ v ].mn = min( t[ pos ][ v + v ].mn, t[ pos ][ v + v + 1 ].mn );
}
 
void gett( int v, int tl, int tr, int l, int r ) {
	if ( tl > r || tr < l )
		return;
	if ( tl >= l && tr <= r ) {
		an.mx = max( an.mx, t[ pos ][ v ].mx );
		an.mn = min( an.mn, t[ pos ][ v ].mn );
		return;
	}
	pus( v );
	int mid = ( tl + tr ) / 2;
	gett( v + v, tl, mid, l, r );
	gett( v + v + 1, mid + 1, tr, l, r );
}
 
void lca( int l, int r, int b ) {
	ans = 0;
	num = 0;
	for ( int i = 16; i >= 0; i -- ) {
		an.clear();
		pos = i;
		gett( 1, 1, n, l, r );
		if ( an.mx < b || an.mn > b ) {
			l = min( an.mn, l );
			r = max( an.mx, r );
//			cout << i << ", ";
			ans += ( 1ll << i );
		}
	}
	ans ++;
	return;
}
 
main () {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
	cin >> n >> k;
	cin >> m;
	for ( int i = 1; i <= m; i ++ ) {
		cin >> a[ i ] >> b[ i ];
	}
	cin >> q;
	for ( int i = 0; i < 17; i ++ )
		pos = i, build( 1, 1, n );
	for ( int i = 1; i <= q; i ++ ) {
		cin >> s[ i ] >> f[ i ];
	}
//	if ( n <= 2000 && m <= 2000 && q <= 2000 ) {
//		
//	}
	for ( int i = 1; i <= m; i ++ ) {
		if ( a[ i ] > b[ i ] ) {
			num = b[ i ];
			pos = 0;
			updd( 1, 1, n, a[ i ] - k + 1, a[ i ] );
		}
		else {
			num = b[ i ];
			pos = 0;
			upd( 1, 1, n, a[ i ], a[ i ] + k - 1 );
		}
	}
	int l = n + 1, r = 0;
	for ( int i = 1; i < 17; i ++ ) {
		for ( int j = 1; j <= n; j ++ ) {
			an.clear();
			pos = i - 1;
			gett( 1, 1, n, j, j );
			l = an.mn;
			r = an.mx;
			if ( !r )
				r = j;
			if ( l == n + 1 )
				l = j;
			an.clear();
			gett( 1, 1, n, l, r );
			num = an.mx;
			pos = i;
			upd( 1, 1, n, j, j );
			num = an.mn;
			updd( 1, 1, n, j, j );
		}
	}
//	for ( int i = 0; i < 20; i ++ ) {
//		for ( int j = 1; j <= n; j ++ ) {
//			pos = i;
//			an.clear();
//			gett( 1, 1, n, j, j );
//			cout << j << " " << i << " - " << an.mn << " " << an.mx << endl;
//		}
//	}
	for ( int i = 1; i <= q; i ++ ) {
		if ( s[ i ] == f[ i ] ) {
			cout << "0\n";
			continue;
		}
		lca( s[ i ], s[ i ], f[ i ] );
		if ( ans == ( 1 << 17 ) )
			cout << "-1\n";
		else
			cout << ans << "\n";
	}
}

Compilation message (stderr)

Main.cpp:153:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  153 | main () {
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...