#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
using namespace __gnu_pbds;
using namespace std;
#define pb push_back
#define st first
#define nd second
typedef long long ll;
typedef long double ld;
const ll I = 1000'000'000'000'000'000LL;
const int II = 2'000'000'000;
const ll M = 1000'000'007LL;
const int K = 18;
const int N = 1<<K;
int l[N], r[N];
int jp[2][K][N];
int drz[2][K][2 * N];
vector<int> beg[N], en[N];
multiset<int> aktt;
void Build(int p, int k)
{
for(int v = N - 1; v >= 1; --v)
drz[p][k][v] = max(drz[p][k][v * 2], drz[p][k][v * 2 + 1]);
}
int Query(int p, int k, int a, int b)
{
a += N - 1; b += N + 1;
int ans = -II;
while(a / 2 != b / 2)
{
if(a % 2 == 0) ans = max(ans, drz[p][k][a + 1]);
if(b % 2 == 1) ans = max(ans, drz[p][k][b - 1]);
a /= 2; b /= 2;
}
if(p == 0) return -ans;
return ans;
}
void LiczJP(int n)
{
for(int i = 1; i <= n; ++i)
{
jp[0][0][i] = l[i]; jp[1][0][i] = r[i];
drz[0][0][i + N] = -jp[0][0][i];
drz[1][0][i + N] = jp[1][0][i];
}
Build(0, 0);
Build(1, 0);
for(int j = 1; j < K; ++j)
{
for(int i = 1; i <= n; ++i)
{
int a = jp[0][j - 1][i], b = jp[1][j - 1][i];
jp[0][j][i] = Query(0, j - 1, a, b);
jp[1][j][i] = Query(1, j - 1, a, b);
drz[0][j][i + N] = -jp[0][j][i];
drz[1][j][i + N] = jp[1][j][i];
}
Build(0, j);
Build(1, j);
}
}
int Jump(int a, int t)
{
int b = a, ans = 0;
for(int j = K - 1; j >= 0; --j)
{
int na = Query(0, j, a, b), nb = Query(1, j, a, b);
if(!(na <= t && nb >= t))
{
ans += (1<<j);
a = na; b = nb;
}
}
if(ans == (1<<K) - 1) return -1;
if(a <= t && b >= t) return ans;
return ans + 1;
}
void Solve()
{
int n, m, k, q, a, b;
cin >> n >> k;
cin >> m;
for(int i = 1; i <= m; ++i)
{
cin >> a >> b;
if(a <= b)
{
beg[a].pb(b);
en[min(b + 1, a + k)].pb(b);
}else
{
swap(a, b);
beg[max(a, b - k + 1)].pb(a);
en[b + 1].pb(a);
}
}
for(int i = 1; i <= n; ++i)
{
for(int j = 0; j < (int)beg[i].size(); ++j) aktt.insert(beg[i][j]);
for(int j = 0; j < (int)en[i].size(); ++j) aktt.erase(aktt.find(en[i][j]));
l[i] = i; r[i] = i;
if((int)aktt.size() > 0)
{l[i] = *aktt.begin(); r[i] = *aktt.rbegin();}
l[i] = min(l[i], i); r[i] = max(r[i], i);
}
LiczJP(n);
cin >> q;
for(int i = 1; i <= q; ++i)
{
cin >> a >> b;
int ans = Jump(a, b);
cout << ans << "\n";
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
//int t; cin >> t;
//while(t--)
Solve();
return 0;
}
# | 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... |