//Huyduocdithitp
#include <bits/stdc++.h>
typedef int ll;
#define pii pair<ll, ll>
#define MP make_pair
#define fi first
#define se second
#define TASK "flip3"
#define start if(fopen(TASK".inp","r")){freopen(TASK".inp","r",stdin);freopen(TASK".out","w",stdout);}
#define faster ios_base::sync_with_stdio(false);cin.tie(NULL);
#define N 2000006
#define LOG 19
#define endl '\n'
using namespace std;
const ll inf = 2e9, mod = 1e9 + 7;
bool ghuy4g;
ll n;
ll a[N], b[N];
pii st1[4 * N], st2[4 * N];
void upd1(ll id, ll l, ll r, ll i, pii v) {
if (i > r || i < l) return;
if (l == r) {
st1[id] = v;
return;
}
ll mid = (l + r) / 2;
upd1(id * 2, l, mid, i, v);
upd1(id * 2 + 1, mid + 1, r, i, v);
st1[id] = max(st1[id * 2], st1[id * 2 + 1]);
}
void upd2(ll id, ll l, ll r, ll i, pii v) {
if (i > r || i < l) return;
if (l == r) {
st2[id] = v;
return;
}
ll mid = (l + r) / 2;
upd2(id * 2, l, mid, i, v);
upd2(id * 2 + 1, mid + 1, r, i, v);
st2[id] = min(st2[id * 2], st2[id * 2 + 1]);
}
pii get1(ll id, ll l, ll r, ll L, ll R) {
if (l > R || r < L) {
return {0, 0};
}
if (L <= l && r <= R) {
return st1[id];
}
ll mid = (l + r) / 2;
return max(get1(id * 2, l, mid, L, R), get1(id * 2 + 1, mid + 1, r, L, R));
}
pii get2(ll id, ll l, ll r, ll L, ll R) {
if (l > R || r < L) {
return {inf, 0};
}
if (L <= l && r <= R) {
return st2[id];
}
ll mid = (l + r) / 2;
return min(get2(id * 2, l, mid, L, R), get2(id * 2 + 1, mid + 1, r, L, R));
}
bool vst[N];
ll num[N];
vector<ll> vt[2];
void dfs(ll u) {
//cout << "choi " << u << " " << num[u] << endl;
vst[u] = 1;
vt[num[u]].push_back(u);
upd1(1, 1, 2 * n, a[u], {0, 0});
upd2(1, 1, 2 * n, b[u], {inf, 0});
while (true) {
pii x1 = get1(1, 1, 2 * n, a[u] + 1, b[u] - 1);
if (x1.fi > b[u]) {
ll v = x1.se;
num[v] = 1 - num[u];
dfs(v);
}
else {
pii x2 = get2(1, 1, 2 * n, a[u] + 1, b[u] - 1);
if (x2.fi < a[u]) {
ll v = x2.se;
num[v] = 1 - num[u];
dfs(v);
}
else {
break;
}
}
}
}
bool cmp(ll u, ll v) {
if (a[u] == a[v]) {
return b[u] < b[v];
}
return a[u] < a[v];
}
bool klinh;
signed main(void) {
faster;
cin >> n;
for (int i = 0; i < 4 * N; i ++) {
st2[i] = {inf, 0};
}
for (int i = 1; i <= n; i ++) {
cin >> a[i] >> b[i];
upd1(1, 1, 2 * n, a[i], {b[i], i});
upd2(1, 1, 2 * n, b[i], {a[i], i});
}
ll ans = 1;
for (int i = 1; i <= n; i ++) {
if (vst[i] == 1) continue;
vt[0].clear();
vt[1].clear();
dfs(i);
//continue;
for (int j = 0; j < 2; j ++) {
sort(vt[j].begin(), vt[j].end(), cmp);
stack<ll> st;
for (auto k : vt[j]) {
//cout << k << " ";
//continue;
while (st.size() && b[st.top()] < a[k]) {
st.pop();
}
//continue;
if (st.size() && b[st.top()] < b[k]) {
cout << 0;
exit(0);
}
//continue;
st.push(k);
}
//cout << endl;
//continue;
}
ans = ans + ans;
if (ans >= mod) {
ans -= mod;
}
}
cout << ans;
cerr << fabs(&klinh - &ghuy4g) / double(1024 * 1024);
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... |