#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <unordered_map>
#include <stack>
#include <bitset>
#include <string>
#include <cstring>
#include <iterator>
#include <random>
#define ll long long
#define ld long double
#define inf (ll)(2*1e18)
#define sort(a) sort(a.begin(), a.end())
#define reverse(a) reverse(a.begin(), a.end())
#define pb push_back
#define endl "\n"
using namespace std;
const ll dim=22;
void build(ll id, ll l, ll r, vector<pair<ll, ll>>& a, vector<pair<ll, ll>>& b){
if(l == r){
b[id] = a[l];
return;
}
ll m=(l+r)/2;
build(2*id, l, m, a, b);
build(2*id+1, m+1, r, a, b);
b[id].first = min(b[2*id].first, b[2*id+1].first);
b[id].second = max(b[2*id].second, b[2*id+1].second);
}
pair<ll, ll> get(ll id, ll l, ll r, ll tl, ll tr, vector<pair<ll, ll>>& b){
if(r < tl or tr < l) return {inf, -inf};
if(tl <= l and r <= tr){
return b[id];
}
ll m=(l+r)/2;
pair<ll, ll> res1, res2;
res1 = get(2*id, l, m, tl, tr, b);
res2 = get(2*id+1, m+1, r, tl, tr, b);
return {min(res1.first, res2.first), max(res1.second, res2.second)};
}
ll find(ll x, ll y, ll n, vector<vector<pair<ll, ll>>>& b){
pair<ll, ll> res=get(1, 0, n-1, x, x, b[dim-1]);
ll ans=0, l=x, r=x;
if(y < res.first or res.second < y) return -1;
for(int i=dim-1;i>=0;--i){
res = get(1, 0, n-1, l, r, b[i]);
if(y < res.first or res.second < y){
ans += (1<<i);
l = res.first;
r = res.second;
}
}
return ans+1;
}
void solve(){
ll n, k, m, q, i, j, x, y;
cin>>n>>k>>m;
vector<vector<ll>> addA(n);
vector<vector<ll>> delA(n);
vector<vector<ll>> addB(n);
vector<vector<ll>> delB(n);
vector<pair<ll, ll>> a(n);
multiset<ll> s;
vector<vector<pair<ll, ll>>> b(dim, vector<pair<ll, ll>>(4*n));
for(i=0;i<m;++i){
cin>>x>>y;
--x;
--y;
if(x < y){
addA[x].pb(y);
delA[min(x + k - 1, y - 1)].pb(y);
}else{
addB[x].pb(y);
delB[max(x - k + 1, y + 1)].pb(y);
}
}
for(i=0;i<n;++i){
a[i] = {i, i};
for(auto el: addA[i]){
s.insert(el);
}
if(!s.empty()){
a[i].second = max(*s.rbegin(), a[i].second);
}
for(auto el: delA[i]){
s.erase(s.find(el));
}
}
for(i=n-1;i>=0;--i){
for(auto el: addB[i]){
s.insert(el);
}
if(!s.empty()){
a[i].first = min(*s.begin(), a[i].first);
}
for(auto el: delB[i]){
s.erase(s.find(el));
}
}
for(i=0;i<dim;++i){
build(1, 0, n-1, a, b[i]);
for(j=0;j<n;++j){
a[j] = get(1, 0, n-1, a[j].first, a[j].second, b[i]);
}
}
cin>>q;
for(i=0;i<q;++i){
cin>>x>>y;
--x;
--y;
cout<<find(x, y, n,b)<<endl;
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
srand(time(nullptr));
ll t=1;
// cin>>t;
for(;t>0;--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... |