이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
const int Z = 1e5, B = 17;
int N, K, M;
struct ST {
int a[2*Z] {}, minQry = 0;
void update(int i, int v) {
i += N;
for(a[i] = max(a[i], minQry ? Z-v : v); i /= 2; )
a[i] = max(a[2*i], a[2*i+1]);
}
int query(int l, int r) {
int x {};
for(l += N, r += N + 1; l < r; l /= 2, r /= 2) {
if(l & 1) x = max(x, a[l++]);
if(r & 1) x = max(x, a[--r]);
}
return minQry ? Z-x : x;
}
int operator[](int i) {
return minQry ? Z - a[i + N] : a[i + N];
}
} s[2][B];
int main() {
ios::sync_with_stdio(0), cin.tie(0);
cin >> N >> K >> M;
priority_queue<array<int, 2>> q[2];
vector<array<int, 2>> g[2][N];
while(M--) {
int l, r; cin >> l >> r;
--l, --r;
if(l < r)
g[1][l].push_back({r, min(l + K - 1, r)});
else
g[0][max(l - K + 1, r)].push_back({-r, l});
}
for(int i = 0; i < B; ++i)
s[0][i].minQry = 1;
for(int i = 0; i < N; ++i) {
for(int j : {0, 1}) {
for(auto k : g[j][i]) q[j].push(k);
while(!empty(q[j]) && q[j].top()[1] < i) q[j].pop();
s[j][0].update(i, empty(q[j]) ? i : (j ? 1 : -1) * q[j].top()[0]);
}
}
for(int k = 0; k + 1 < B; ++k) {
for(int j : {0, 1}) for(int i = 0; i < N; ++i)
s[j][k + 1].update(i, s[j][k].query(s[0][k][i], s[1][k][i]));
}
cin >> M;
while(M--) {
int l, t; cin >> l >> t;
--l, --t;
int r = l, x {};
for(int i = B; i--; ) {
int sl = s[0][i].query(l, r);
int sr = s[1][i].query(l, r);
if(sl > t || t > sr) {
l = sl, r = sr;
x |= 1<<i;
}
}
cout << (++x > N ? -1 : x) << '\n';
}
}
# | 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... |