Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define int long long
- #define pb push_back
- #define all(a) a.begin(), a.end()
- #define rall(a) a.rbegin(), a.rend()
- void out(vector<int> a) {
- for (auto it = a.begin(); it != a.end(); ++it) cout << (*it) << " ";
- cout << endl;
- }
- struct node{
- int l, r;
- int mn = 1e9;
- };
- int n;
- vector<pair<int, int > > a;
- const int N = 5e5;
- node tree[4*N];
- inline void read() {
- cin >> n;
- a.resize(n);
- for (int i = 0; i<n; ++i) cin >> a[i].first >> a[i].second;
- }
- vector<pair<int, pair<bool, int> > > b;
- vector<int> res;
- inline void solve1() {
- res.resize(n, n-1);
- for (int i = 0; i<n; ++i) {
- b.pb({a[i].first, {0, i}});
- b.pb({a[i].second, {1, i}});
- }
- sort(all(b));
- vector<pair<int, int> > pref(2*n);
- if (b[0].second.first == 0) ++pref[0].first;
- else ++pref[0].second;
- for (int i = 1; i<2*n; ++i) {
- pref[i] = pref[i-1];
- if (b[i].second.first == 0) ++pref[i].first;
- else ++pref[i].second;
- }
- for (int i = 0; i<2*n; ++i) {
- int id = b[i].second.second;
- int d;
- if (b[i].second.first == 0) d = pref[i].second;
- else d = pref[2*n-1].first - pref[i].first;
- res[id] -= d;
- }
- }
- void push(int i) {
- if (tree[i].mn != 1e9 && tree[i].l != tree[i].r) {
- tree[2 * i].mn = min(tree[2 * i].mn, tree[i].mn);
- tree[2 * i + 1].mn = min(tree[2 * i + 1].mn, tree[i].mn);
- tree[i].mn = 1e9;
- }
- }
- void build(int i, int l, int r) {
- if (l > r) return;
- tree[i].l = l, tree[i].r = r;
- if (l == r) {
- tree[i].mn = 1e9;
- return;
- }
- int mid = (l + r) / 2;
- build(2 * i, l, mid);
- build(2 * i + 1, mid + 1, r);
- tree[i].mn = min(tree[2 * i].mn, tree[2 * i + 1].mn);
- }
- void update(int i, int l, int r, int val) {
- push(i);
- if (tree[i].l > r || tree[i].r < l) return;
- if (tree[i].l >= l && tree[i].r <= r) {
- tree[i].mn = min(tree[i].mn, val);
- return;
- }
- update(2 * i, l, r, val);
- update(2 * i + 1, l, r, val);
- tree[i].mn = min(tree[2 * i].mn, tree[2 * i + 1].mn);
- }
- int get_min(int i, int l, int r) {
- push(i);
- if (l > r || r < tree[i].l || l > tree[i].r) return 1e9;
- if (l <= tree[i].l && r >= tree[i].r) return tree[i].mn;
- return min(get_min(2 * i, l, r), get_min(2 * i + 1, l, r));
- }
- inline void solve2() {
- vector<pair<int, int> > start(n);
- for (int i = 0; i<2*n; ++i) {
- int id = b[i].second.second;
- if (b[i].second.first == 0) start[id] = {i, start[id].second};
- else start[id] = {start[id].first, i};
- }
- build(1, 0, 2*n-1);
- for (int i = 0; i<n; ++i) cout << res[i] << " ";
- cout << endl;
- for (int i = 0; i<n; ++i) {
- cout << start[i].first << " " << start[i].second << endl;
- }
- for (int i = 0; i<n; ++i) {
- update(1, start[i].first, start[i].second, res[i]);
- }
- for (int i = 0; i<n; ++i) {
- cout << get_min(1, start[i].first, start[i].second) << " ";
- }
- }
- signed main() {
- ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
- cout << fixed << setprecision(20);
- //freopen("input.txt", "r", stdin);
- //freopen("output.txt", "w", stdout);
- read();
- solve1();
- solve2();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement