Submission #703944

#TimeUsernameProblemLanguageResultExecution timeMemory
703944LittleCubeRailway Trip 2 (JOI22_ho_t4)C++14
100 / 100
652 ms68700 KiB
#pragma GCC optimize("Ofast,unroll-loops") #include <bits/stdc++.h> #define ll long long #define pii pair<int, int> #define pll pair<ll, ll> #define F first #define S second using namespace std; const int P = 18; int N, K, M, Q; pii sp[100005][P], seg[P][400005], range[P][100005]; pii merge(pii p1, pii p2) { return pii(min(p1.F, p2.F), max(p1.S, p2.S)); } void build(int p, int i = 1, int L = 1, int R = N) { if (L == R) seg[p][i] = range[p][L]; else { int mid = (L + R) / 2; build(p, i << 1, L, mid); build(p, i << 1 | 1, mid + 1, R); seg[p][i] = merge(seg[p][i << 1], seg[p][i << 1 | 1]); } } pii query(int qL, int qR, int p, int i = 1, int L = 1, int R = N) { if (R < qL || qR < L) return pii(N + 1, 0); else if (qL <= L && R <= qR) return seg[p][i]; else { int mid = (L + R) / 2; return merge(query(qL, qR, p, i << 1, L, mid), query(qL, qR, p, i << 1 | 1, mid + 1, R)); } } signed main() { ios::sync_with_stdio(0), cin.tie(0); cin >> N >> K >> M; for (int i = 0; i < P; i++) for (int j = 1; j <= N; j++) sp[j][i] = pii(N + 1, 0); for (int i = 1; i <= M; i++) { int A, B, lg; cin >> A >> B; lg = __lg(min(abs(B - A) + 1, K)); if (A < B) { sp[A][lg].S = max(sp[A][lg].S, B); sp[min(B, A + K - 1) - (1 << lg) + 1][lg].S = max(sp[min(B, A + K - 1) - (1 << lg) + 1][lg].S, B); } else { sp[A - (1 << lg) + 1][lg].F = min(sp[A - (1 << lg) + 1][lg].F, B); sp[max(B, A - K + 1)][lg].F = min(sp[max(B, A - K + 1)][lg].F, B); } } for (int i = P - 1; i > 0; i--) for (int j = 1; j + (1 << i) - 1 <= N; j++) { sp[j][i - 1] = merge(sp[j][i - 1], sp[j][i]); int k = j + (1 << (i - 1)); sp[k][i - 1] = merge(sp[k][i - 1], sp[j][i]); } for (int j = 1; j <= N; j++) range[0][j].F = min(sp[j][0].F, j), range[0][j].S = max(sp[j][0].S, j); for (int j = 1; j < P; j++) { build(j - 1); for (int i = 1; i <= N; i++) range[j][i] = query(range[j - 1][i].F, range[j - 1][i].S, j - 1); } build(P - 1); cin >> Q; for (int i = 1; i <= Q; i++) { int L, R, T, ans = 0; cin >> L >> T; R = L; for (int j = P - 1; j >= 0; j--) { pii p = query(L, R, j); if (T < p.F || p.S < T) tie(L, R) = p, ans += (1 << j); } cout << (ans > N ? -1 : ans + 1) << '\n'; } }
#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...