Submission #533290

#TimeUsernameProblemLanguageResultExecution timeMemory
533290arnold518Railway Trip 2 (JOI22_ho_t4)C++17
100 / 100
871 ms67648 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int MAXN = 1e5;
const int INF = 1e9;

int N, M, K;
pii A[MAXN+10];

pii operator + (const pii &p, const pii &q) { return {min(p.first, q.first), max(p.second, q.second)}; }

struct SEG
{
	pii tree[MAXN*4+10];

	void init(int node, int tl, int tr)
	{
		if(tl==tr)
		{
			tree[node]={tl, tl};
			return;
		}
		int mid=tl+tr>>1;
		init(node*2, tl, mid);
		init(node*2+1, mid+1, tr);
		tree[node]={INF, -INF};
	}

	void update(int node, int tl, int tr, int l, int r, pii k)
	{
		if(r<tl || tr<l) return;
		if(l<=tl && tr<=r)
		{
			tree[node]=tree[node]+k;
			return;
		}
		int mid=tl+tr>>1;
		update(node*2, tl, mid, l, r, k);
		update(node*2+1, mid+1, tr, l, r, k);
	}	

	void query(int node, int tl, int tr, pii t)
	{
		t.first=min(t.first, tree[node].first);
		t.second=max(t.second, tree[node].second);
		if(tl==tr)
		{
			A[tl]=t;
			return;
		}
		int mid=tl+tr>>1;
		query(node*2, tl, mid, t);
		query(node*2+1, mid+1, tr, t);
	}
}seg;

struct SEG2
{
	pii tree[MAXN*4+10][30];
	
	pii query(int node, int tl, int tr, int l, int r, int k)
	{
		if(l<=tl && tr<=r) return tree[node][k];
		if(r<tl || tr<l) return {INF, -INF};
		int mid=tl+tr>>1;
		return query(node*2, tl, mid, l, r, k)+query(node*2+1, mid+1, tr, l, r, k);
	}

	void flush(int node, int tl, int tr, int k)
	{
		if(tl==tr)
		{
			tree[node][k]=A[tl];
			return;
		}
		int mid=tl+tr>>1;
		flush(node*2, tl, mid, k);
		flush(node*2+1, mid+1, tr, k);
		tree[node][k]=tree[node*2][k]+tree[node*2+1][k];
	}

	void init()
	{
		flush(1, 1, N, 0);
		for(int i=1; i<=20; i++)
		{
			for(int j=1; j<=N; j++)	A[j]=query(1, 1, N, A[j].first, A[j].second, i-1);
			flush(1, 1, N, i);
		}
	}
}seg2;

int main()
{
	scanf("%d%d%d", &N, &K, &M);
	seg.init(1, 1, N);
	for(int i=1; i<=M; i++)
	{
		int l, r;
		scanf("%d%d", &l, &r);
		if(l<r)
		{
			seg.update(1, 1, N, l, min(l+K-1, r-1), {INF, r});
		}
		else
		{
			seg.update(1, 1, N, max(l-K+1, r+1), l, {r, -INF});
		}
	}
	seg.query(1, 1, N, {INF, -INF});
	seg2.init();

	scanf("%d", &M);
	while(M--)
	{
		int s, e;
		scanf("%d%d", &s, &e);
		pii t=seg2.query(1, 1, N, s, s, 20);
		if(t.first>e || t.second<e) { printf("-1\n"); continue; }

		int ans=0, l=s, r=s;
		for(int i=19; i>=0; i--)
		{
			pii t=seg2.query(1, 1, N, l, r, i);
			if(t.first>e || t.second<e)
			{
				ans|=(1<<i);
				l=t.first; r=t.second;
			}
		}
		printf("%d\n", ans+1);
	}
}

Compilation message (stderr)

Main.cpp: In member function 'void SEG::init(int, int, int)':
Main.cpp:27:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   27 |   int mid=tl+tr>>1;
      |           ~~^~~
Main.cpp: In member function 'void SEG::update(int, int, int, int, int, pii)':
Main.cpp:41:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   41 |   int mid=tl+tr>>1;
      |           ~~^~~
Main.cpp: In member function 'void SEG::query(int, int, int, pii)':
Main.cpp:55:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   55 |   int mid=tl+tr>>1;
      |           ~~^~~
Main.cpp: In member function 'pii SEG2::query(int, int, int, int, int, int)':
Main.cpp:69:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   69 |   int mid=tl+tr>>1;
      |           ~~^~~
Main.cpp: In member function 'void SEG2::flush(int, int, int, int)':
Main.cpp:80:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   80 |   int mid=tl+tr>>1;
      |           ~~^~~
Main.cpp: In function 'int main()':
Main.cpp:99:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   99 |  scanf("%d%d%d", &N, &K, &M);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~
Main.cpp:104:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  104 |   scanf("%d%d", &l, &r);
      |   ~~~~~^~~~~~~~~~~~~~~~
Main.cpp:117:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  117 |  scanf("%d", &M);
      |  ~~~~~^~~~~~~~~~
Main.cpp:121:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  121 |   scanf("%d%d", &s, &e);
      |   ~~~~~^~~~~~~~~~~~~~~~
#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...