// CF template, version 3.0
#include <bits/stdc++.h>
using namespace std;
#define improvePerformance ios_base::sync_with_stdio(false); cin.tie(0)
#define getTest int t; cin >> t
#define eachTest for (int _var=0;_var<t;_var++)
#define get(name) int (name); cin >> (name)
#define out(o) cout << (o)
#define getList(cnt, name) vector<int> (name); for (int _=0;_<(cnt);_++) { get(a); (name).push_back(a); }
#define sortl(name) sort((name).begin(), (name).end())
#define rev(name) reverse((name).begin(), (name).end())
#define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
#define decision(b) if (b){out("YES");}else{out("NO");}
#define int long long int
template <typename T, typename I>
struct segtree {
int n;
vector<T> tree;
vector<I> initial;
T id;
segtree(int i_n, vector<I> i_initial, T i_id): n(i_n), initial(i_initial), id(i_id) {
tree.resize(4 * n);
}
T conquer(T left, T right) {
// write your conquer function
}
T value(I inp) {
// write your value function
}
void build(int v, int l, int r) {
if (l == r) tree[v] = value(initial[l]);
else {
int middle = (l + r) / 2;
build(2 * v, l, middle);
build(2 * v + 1, middle + 1, r);
tree[v] = conquer(tree[2 * v], tree[2 * v + 1]);
}
}
void upd(int v, int l, int r, int i, I x) {
if (l == r) tree[v] = value(x);
else {
int middle = (l + r) / 2;
if (middle >= i) upd(2 * v, l, middle, i, x);
else upd(2 * v + 1, middle + 1, r, i, x);
tree[v] = conquer(tree[2 * v], tree[2 * v + 1]);
}
}
T query(int v, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return tree[v];
else if (r < ql || qr < l) return id;
int middle = (l + r) / 2;
T left = query(2 * v, l, middle, ql, qr);
T right = query(2 * v + 1, middle + 1, r, ql, qr);
return conquer(left, right);
}
};
// vector<int>
vector<vector<int>> lift;
vector<int> go;
int calc(int l, int r) {
int d = l;
int ret = 0;
while (d < r) {
if (go[d] == d) break;
int i = 19;
int p = 524288;
bool did = false;
while (i >= 0) {
int dest = lift[d][i];
if (dest <= r) {
d = dest;
ret += p;
did = true;
break;
}
i--;
p /= 2;
}
if (!did) {
d = lift[d][0];
ret++;
}
}
/*out(l);
out(" ");
out(r);
out(" ");
out(d);
out(endl);*/
if (d >= r) return ret;
return 1e18;
}
signed main() {
improvePerformance;
//getTest;
//eachTest {
get(n);
get(m);
vector<pair<int, int>> ranges;
vector<pair<int, int>> wraps;
vector<int> vals;
int r = 0;
int w = 0;
forto(n, i) {
get(s);
get(e);
vals.push_back(s);
vals.push_back(e);
if (s < e) ranges.push_back({s, e}), r++;
else wraps.push_back({e, s}), w++;
}
vals.push_back(0);
vals.push_back(m - 1);
map<int, int> coords;
sortl(vals);
int ind = 0;
int s = vals.size();
forto(s, i) {
if (i == 0 || vals[i] != vals[i - 1]) coords[vals[i]] = ind++;
}
int N = ind;
forto(r, i) {
ranges[i].first = coords[ranges[i].first];
ranges[i].second = coords[ranges[i].second];
}
forto(w, i) {
wraps[i].first = coords[wraps[i].first];
wraps[i].second = coords[wraps[i].second];
}
int maxwrap = 0;
forto(w, i) maxwrap = max(maxwrap, wraps[i].first);
int minwrap = N;
forto(w, i) minwrap = min(minwrap, wraps[i].second);
sortl(ranges);
go.resize(N);
int maxi = 0;
int ptr = 0;
forto(N, i) {
while (ptr < r && ranges[ptr].first <= i) maxi = max(maxi, ranges[ptr++].second);
maxi = max(maxi, i);
go[i] = maxi;
}
lift.resize(N, vector<int>(20));
for (int i = N - 1; i >= 0; i--) {
lift[i][0] = go[i];
forto(20, j) {
if (j == 0) continue;
lift[i][j] = lift[lift[i][j - 1]][j - 1];
}
}
int ans = 1e18;
int onlyrng = 0;
ind = 0;
while (ind < N && go[ind] != ind) onlyrng++, ind = go[ind];
if (go[ind] != ind) ans = min(ans, onlyrng);
sortl(wraps);
rev(wraps);
int indone = N;
ptr = 0;
for (int i = maxwrap; i >= 0; i--) {
int two = calc(i, minwrap) + 2;
while (ptr < w && wraps[ptr].first >= i) indone = min(indone, wraps[ptr++].second);
int one = calc(i, indone) + 1;
ans = min({ans, one, two});
}
if (ans == 1e18) out(-1);
else out(ans);
//}
}
Compilation message
Main.cpp: In function 'int main()':
Main.cpp:10:23: warning: unnecessary parentheses in declaration of 'n' [-Wparentheses]
10 | #define get(name) int (name); cin >> (name)
| ^
Main.cpp:113:9: note: in expansion of macro 'get'
113 | get(n);
| ^~~
Main.cpp:10:23: warning: unnecessary parentheses in declaration of 'm' [-Wparentheses]
10 | #define get(name) int (name); cin >> (name)
| ^
Main.cpp:114:9: note: in expansion of macro 'get'
114 | get(m);
| ^~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
| ^
Main.cpp:120:9: note: in expansion of macro 'forto'
120 | forto(n, i) {
| ^~~~~
Main.cpp:10:23: warning: unnecessary parentheses in declaration of 's' [-Wparentheses]
10 | #define get(name) int (name); cin >> (name)
| ^
Main.cpp:121:13: note: in expansion of macro 'get'
121 | get(s);
| ^~~
Main.cpp:10:23: warning: unnecessary parentheses in declaration of 'e' [-Wparentheses]
10 | #define get(name) int (name); cin >> (name)
| ^
Main.cpp:122:13: note: in expansion of macro 'get'
122 | get(e);
| ^~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
| ^
Main.cpp:134:9: note: in expansion of macro 'forto'
134 | forto(s, i) {
| ^~~~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
| ^
Main.cpp:138:9: note: in expansion of macro 'forto'
138 | forto(r, i) {
| ^~~~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
| ^
Main.cpp:142:9: note: in expansion of macro 'forto'
142 | forto(w, i) {
| ^~~~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
| ^
Main.cpp:147:9: note: in expansion of macro 'forto'
147 | forto(w, i) maxwrap = max(maxwrap, wraps[i].first);
| ^~~~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
| ^
Main.cpp:149:9: note: in expansion of macro 'forto'
149 | forto(w, i) minwrap = min(minwrap, wraps[i].second);
| ^~~~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
| ^
Main.cpp:154:9: note: in expansion of macro 'forto'
154 | forto(N, i) {
| ^~~~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'j' [-Wparentheses]
15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
| ^
Main.cpp:162:13: note: in expansion of macro 'forto'
162 | forto(20, j) {
| ^~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
424 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
348 KB |
Output is correct |
6 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
424 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
348 KB |
Output is correct |
6 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
424 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
348 KB |
Output is correct |
6 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
2 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
424 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
348 KB |
Output is correct |
6 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |