이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
#define all(x)      (x).begin(),(x).end()
#define X           first
#define Y           second
#define sep         ' '
#define endl        '\n'
#define SZ(x)       ll(x.size())
#define lc          id << 1
#define rc          lc | 1
const ll MAXN = 2e6 + 10;
const ll LOG = 22;
const ll INF = 8e18;
const ll MOD = 1e9 + 7; //998244353; //1e9 + 9;
int n , cnt , ans = 1 , A[MAXN] , B[MAXN] , mark[MAXN];
pii seg[2][MAXN << 2];
vector<pii> vec[2];
void modify(int ind , int pos , pii val , int id = 1 , int l = 0 , int r = 2 * n){
	if(r - l == 1){
		seg[ind][id] = val;
		return;
	}
	int mid = l + r >> 1;
	if(pos < mid)	modify(ind , pos , val , lc , l , mid);
	else	modify(ind , pos , val , rc , mid , r);
	seg[ind][id] = min(seg[ind][lc] , seg[ind][rc]);
}
pii get(int ind , int ql , int qr , int id = 1 , int l = 0 , int r = 2 * n){
	if(qr <= l || r <= ql)	return {MOD, MOD};
	if(ql <= l && r <= qr)	return seg[ind][id];
	int mid = l + r >> 1;
	return min(get(ind , ql , qr , lc , l , mid), get(ind , ql , qr , rc , mid , r));
}
void DFS(int v , int col){
	mark[v] = 1;
	modify(0 , B[v] , {MOD , v});
	modify(1 , A[v] , {MOD , v});
	vec[col].push_back({A[v] , B[v]});
	while(1){
		pii u = get(0 , A[v] , B[v]);
		if(u.X > A[v])	break;
		DFS(u.Y , 1 - col);
	}
	while(1){
		pii u = get(1 , A[v] , B[v]);
		if(-u.X < B[v])	break;
		DFS(u.Y , 1 - col);
	}
}
void check(vector<pii> vec){
	set<int> st;
	sort(all(vec));
	for(pii i : vec){
		auto it = st.lower_bound(i.X);
		if(it != st.end() && (*it) <= i.Y){
			cout << 0 << endl;
			exit(0);
		}
		st.insert(i.Y);
	}
}
int main() {
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	fill(seg[0] , seg[0] + MAXN * 4 , pii(MOD , MOD));
	fill(seg[1] , seg[1] + MAXN * 4 , pii(MOD , MOD));
	cin >> n;
	for(int i = 0 ; i < n ; i++){
		cin >> A[i] >> B[i];
		A[i]--; B[i]--;
		modify(0 , B[i] , {A[i] , i});
		modify(1 , A[i] , {-B[i] , i});
	}
	for(int i = 0 ; i < n ; i++){
		if(!mark[i]){
			DFS(i , 0);
			cnt++;
		}
	}
	check(vec[0]);
	check(vec[1]);
	for(int i = 0 ; i < cnt ; i++){
		ans = ans * 2 % MOD;
	}
	cout << ans << endl;
    return 0;
}
/*
*/
컴파일 시 표준 에러 (stderr) 메시지
port_facility.cpp: In function 'void modify(int, int, pii, int, int, int)':
port_facility.cpp:31:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   31 |  int mid = l + r >> 1;
      |            ~~^~~
port_facility.cpp: In function 'pii get(int, int, int, int, int, int)':
port_facility.cpp:40:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   40 |  int mid = l + r >> 1;
      |            ~~^~~| # | 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... |