This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define fi first
#define se second
#define mp make_pair
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N = (int)1e5 + 1;
const int LOG = 18;
int L[LOG][N];
int R[LOG][N];
multiset<int> add[N];
multiset<int> del[N];
int A[N];
int B[N];
pii segt[LOG][N * 4 + 512];
void build(int dep, int node, int lef, int rig){
if(lef == rig){
segt[dep][node] = mp(L[dep][lef], R[dep][rig]);
return;
}
int mid = (lef + rig) / 2;
build(dep, node * 2, lef, mid);
build(dep, node * 2 + 1, mid + 1, rig);
segt[dep][node].fi = min(segt[dep][node*2].fi, segt[dep][node*2+1].fi);
segt[dep][node].se = max(segt[dep][node*2].se, segt[dep][node*2+1].se);
}
pii get(int dep, int node, int cl, int cr, int tl, int tr){
if(cr < tl || cl > tr){
return mp((int)1e9,-1);
}
if(cl >= tl && cr <= tr){
return segt[dep][node];
}
int mid = (cl + cr) / 2;
pii A = get(dep, node * 2, cl, mid, tl, tr);
pii B = get(dep, node * 2 + 1, mid + 1, cr, tl, tr);
return mp(min(A.fi, B.fi), max(A.se, B.se));
}
int main(){
fastIO;
//freopen("in.txt","r",stdin);
int n, k;
cin >> n >> k;
int m;
cin >> m;
int seg;
for(int id = 1; id <= m ;id ++ ){
cin >> A[id] >> B[id];
if(A[id] < B[id]){
seg = min(B[id], A[id] + k - 1);
add[A[id]].insert(B[id]);
del[seg + 1].insert(B[id]);
}
else{
seg = max(A[id] - k + 1, B[id]);
add[seg].insert(B[id]);
del[A[id] + 1].insert(B[id]);
}
}
multiset<int> pp;
int low;
for(int iq = 1; iq <= n; iq ++ ){
for(auto x : add[iq]){
pp.insert(x);
}
for(auto x : del[iq]){
pp.erase(pp.find(x));
}
L[0][iq] = R[0][iq] = iq;
if(!pp.empty()){
auto it = pp.begin();
L[0][iq] = min(L[0][iq], *it);
it = pp.end();
it -- ;
R[0][iq] = max(R[0][iq], *it);
}
}
pii F;
for(int c = 1; c < LOG; c ++ ){
build(c - 1, 1, 1, n);
for(int iq = 1; iq <= n; iq ++ ){
F = get(c - 1, 1, 1, n, L[c-1][iq], R[c-1][iq]);
L[c][iq] = F.fi;
R[c][iq] = F.se;
}
}
build(LOG - 1, 1, 1, n);
int q;
cin >> q;
int s, t;
int lef, rig;
int dep;
for(int iq = 1; iq <= q; iq ++ ){
cin >> s >> t;
lef = rig = s;
dep = 0;
for(int lg = LOG - 1; lg >= 0 ; lg -- ){
F = get(lg, 1, 1, n, lef, rig);
if(t < F.fi || t > F.se){
lef = F.fi;
rig = F.se;
dep += (1 << lg);
}
}
F = get(0, 1, 1, n, lef, rig);
if(F.fi <= t && t <= F.se){
cout << dep + 1 << "\n";
}
else{
cout << -1 << "\n";
}
}
return 0;
}
Compilation message (stderr)
Main.cpp: In function 'int main()':
Main.cpp:73:9: warning: unused variable 'low' [-Wunused-variable]
73 | int low;
| ^~~
# | 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... |