이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
using ii = pair<int, int>;
using info = pair<int, int>;
#define x first
#define id second
#define v first
#define w second
const int maxn = 2e6 + 6;
const int mod = 1e9 + 7;
int n, s[maxn], t[maxn];
namespace graph {
	vector<ii> g[maxn];
	void add_edge(int u, int v, int w) {
		g[u].emplace_back(v, w);
		g[v].emplace_back(u, w);
	}
} using namespace graph;
namespace merge_sort_tree {
	vector<info> ft[maxn << 2];
	int ptr[maxn << 2];
	// insert(t, {s, id})
	void insert(int &i, info &j, int u = 1, int l = 1, int r = 2 * n) {
		ft[u].emplace_back(j);
		if(l == r) return;
		int m = l + r >> 1;
		if(i <= m) insert(i, j, u << 1, l, m);
		else insert(i, j, u << 1 | 1, m + 1, r);
	}
	// update on range [l, r] => over elems leq k: update(l, r, k, id)
	void update(int &i, int &j, int &k, int &id, int u = 1, int l = 1, int r = 2 * n) {
		// if(r < i or l > j or i > j) return;
		if(i <= l and r <= j) {
			while(ptr[u] < ft[u].size() and ft[u][ptr[u]].x <= k) ptr[u]++;
			if(ptr[u] and ft[u].size()) add_edge(id, ft[u][0].id, 1);
			return;
		} int m = l + r >> 1;
		if(m >= i) update(i, j, k, id, u << 1, l, m);
		if(m + 1 <= j) update(i, j, k, id, u << 1 | 1, m + 1, r);
	}
	// add n lg n edges calculated by update ()
	void build(int u = 1, int l = 1, int r = 2 * n) {
		for(int j = 1; j < ptr[u]; j++) {
			add_edge(ft[u][j - 1].id, ft[u][j].id, 0);
		} if(l == r) return;
		int m = l + r >> 1;
		build(u << 1, l, m);
		build(u << 1 | 1, m + 1, r);
	}
} using namespace merge_sort_tree;
int vis[maxn];
int col[maxn];
void dfs(int u) {
	vis[u] = 1;
	for(ii &e : g[u]) {
		if(!vis[e.v]) {
			col[e.v] = col[u] ^ e.w;
			dfs(e.v);
		}
	}
}
bool valid() {
	vector<int> id(2 * n + 5), op(2 * n + 5);
	for(int i = 1; i <= n; i++) {
		id[s[i]] = i, op[s[i]] = +1;
		id[t[i]] = i, op[t[i]] = -1;
	}
	vector<int> A, B;
	for(int i = 1; i <= (2 * n); i++) {
		if(op[i] == +1) {
			col[id[i]] ? A.push_back(id[i]) : B.push_back(id[i]);
		} else {
			vector<int> &w0t = col[id[i]] ? A : B;
			if(w0t.empty() or w0t.back() != id[i]) {
				return false;
			} else {
				w0t.pop_back();
			}
		}
	} return true;
}
int main(int argc, char const *argv[])
{
	scanf("%d", &n);
	vector<ii> tmp;
	for(int i = 1; i <= n; i++) {
		scanf("%d %d", &s[i], &t[i]);
		tmp.emplace_back(s[i], t[i]);
	}
	sort(tmp.begin(), tmp.end());
	for(int i = 0; i < n; i++) {
		s[i + 1] = tmp[i].first;
		t[i + 1] = tmp[i].second;
	}
	for(int i = 1; i <= n; i++) {
		info j = {s[i], i};
		insert(t[i], j);
	}
	for(int i = 1; i <= n; i++) {
		int x = s[i] + 1, y = t[i] - 1, z = s[i] - 1;
		if(x <= y) update(x, y, z, i);
	}
	build();
	int ans = 1;
	for(int i = 1; i <= n; i++) {
		if(!vis[i]) {
			ans <<= 1;
			if(ans >= mod) {
				ans -= mod;
			}
			dfs(i);
		}
	}
	if(valid()) {
		printf("%d\n", ans);
	} else {
		puts("0");
	}
	return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
port_facility.cpp: In function 'void merge_sort_tree::insert(int&, info&, int, int, int)':
port_facility.cpp:32:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int m = l + r >> 1;
           ~~^~~
port_facility.cpp: In function 'void merge_sort_tree::update(int&, int&, int&, int&, int, int, int)':
port_facility.cpp:40:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    while(ptr[u] < ft[u].size() and ft[u][ptr[u]].x <= k) ptr[u]++;
          ~~~~~~~^~~~~~~~~~~~~~
port_facility.cpp:43:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   } int m = l + r >> 1;
             ~~^~~
port_facility.cpp: In function 'void merge_sort_tree::build(int, int, int)':
port_facility.cpp:52:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int m = l + r >> 1;
           ~~^~~
port_facility.cpp: In function 'int main(int, const char**)':
port_facility.cpp:94:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
  ~~~~~^~~~~~~~~~
port_facility.cpp:97:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &s[i], &t[i]);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~| # | 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... |