Submission #108775

# Submission time Handle Problem Language Result Execution time Memory
108775 2019-05-01T21:33:08 Z bibabas medians (balkan11_medians) C++14
100 / 100
215 ms 12280 KB
#ifdef LOCAL
#define _GLIBCXX_DEBUG
#endif
#include <bits/stdc++.h>
#define ll long long
#define vi vector<int>
#define vvi vector<vi>
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair

int INF = (int)2e9;

using namespace std;

template <class T>
istream& operator >>(istream &in, vector<T> &arr) {
    for (T &cnt : arr) {
        in >> cnt;
    }
    return in;
};

pair<int, int> t_left[(int)8e5], t_right[(int)8e5];
int t_add[(int)8e5];

void push(int v, int tl, int tr){
    t_left[v].first += t_add[v];
    t_right[v].first += t_add[v];
    if (tl != tr){
        t_add[2 * v] += t_add[v];
        t_add[2 * v + 1] += t_add[v];
    }
    t_add[v] = 0;
}

void update(int v, int tl, int tr, int l, int r, int val){
    push(v, tl, tr);
    if (l > r)
        return;
    if (tl > r || l > tr)
        return;
    if (l <= tl && tr <= r){
        t_add[v] += val;
        push(v, tl, tr);
        return;
    }
    int tm = (tl + tr) / 2;
    update(2 * v, tl, tm, l, r, val);
    update(2 * v + 1, tm + 1, tr, l, r, val);
    if (t_left[2 * v].first >= t_left[2 * v + 1].first)
        t_left[v] = t_left[2 * v + 1];
    else
        t_left[v] = t_left[2 * v];
    t_right[v] = min(t_right[2 * v], t_right[2 * v + 1]);
}

pair<int, int> query_left(int v, int tl, int tr, int l, int r){
    push(v, tl, tr);
    if (l <= tl && tr <= r)
        return t_left[v];
    if (tl > r || l > tr)
        return make_pair(INF, -1);
    int tm = (tl + tr) / 2;
    auto a = query_left(2 * v, tl, tm, l, r), b = query_left(2 * v + 1, tm + 1, tr, l, r);
    if (a.first >= b.first)
        return b;
    else
        return a;
}

pair<int, int> query_right(int v, int tl, int tr, int l, int r){
    push(v, tl, tr);
    if (l <= tl && tr <= r)
        return t_right[v];
    if (tl > r || l > tr)
        return make_pair(INF, -1);
    int tm = (tl + tr) / 2;
    auto a = query_right(2 * v, tl, tm, l, r), b = query_right(2 * v + 1, tm + 1, tr, l, r);
    return min(a, b);
}

void build(int v, int tl, int tr){
    if (tl == tr) {
        t_left[v] = mp(0, tl);
        t_right[v] = mp(0, tl);
        return;
    }
    int tm = (tl + tr) / 2;
    build(2 * v, tl, tm);
    build(2 * v + 1, tm + 1, tr);
    t_left[v] = mp(0, tr);
    t_right[v] = mp(0, tl);
}

void solve() {
    unsigned int n; cin >> n;
    vi b(n, 0); cin >> b;
    build(1, 1, 2 * n - 1);
    for (int i = 1; i < n; ++i){
        update(1, 1, 2 * n - 1, min(b[i - 1], b[i]) + 1, max(b[i], b[i - 1]) - 1, 1);
    }
    cout << b[0] << " ";
    update(1, 1, 2 * n - 1, b[0], b[0], 1);
    for (int i = 1; i < n; ++i){
        if (b[i] > b[i - 1]){
            auto a = query_right(1, 1, 2 * n - 1, b[i - 1], 2 * n - 1);
            update(1, 1, 2 * n - 1, a.second, a.second, 1);
            auto c = query_right(1, 1, 2 * n - 1, b[i - 1], 2 * n - 1);
            update(1, 1, 2 * n - 1, c.second, c.second, 1);
            update(1, 1, 2 * n - 1, b[i - 1] + 1, b[i] - 1, -1);
            cout << a.second << " " << c.second << " ";
        }
        if (b[i] == b[i - 1]){
            auto a = query_right(1, 1, 2 * n - 1, b[i - 1], 2 * n - 1);
            update(1, 1, 2 * n - 1, a.second, a.second, 1);
            auto c = query_left(1, 1, 2 * n - 1, 1, b[i - 1]);
            update(1, 1, 2 * n - 1, c.second, c.second, 1);
            update(1, 1, 2 * n - 1, b[i - 1] + 1, b[i] - 1, -1);
            cout << a.second << " " << c.second << " ";
        }
        if (b[i] < b[i - 1]){
            auto a = query_left(1, 1, 2 * n - 1, 1, b[i - 1]);
            update(1, 1, 2 * n - 1, a.second, a.second, 1);
            auto c = query_left(1, 1, 2 * n - 1, 1, b[i - 1]);
            update(1, 1, 2 * n - 1, c.second, c.second, 1);
            update(1, 1, 2 * n - 1, b[i] + 1, b[i - 1] - 1, -1);
            cout << a.second << " " << c.second << " ";
        }
    }
}

int main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#else
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
#endif

    solve();

    return 0;
}

Compilation message

medians.cpp: In function 'void solve()':
medians.cpp:100:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 1; i < n; ++i){
                     ~~^~~
medians.cpp:105:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 1; i < n; ++i){
                     ~~^~~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 2 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 2 ms 384 KB Output is correct
6 Correct 2 ms 384 KB Output is correct
7 Correct 2 ms 384 KB Output is correct
8 Correct 2 ms 384 KB Output is correct
9 Correct 2 ms 384 KB Output is correct
10 Correct 2 ms 384 KB Output is correct
11 Correct 2 ms 384 KB Output is correct
12 Correct 4 ms 384 KB Output is correct
13 Correct 5 ms 512 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 512 KB Output is correct
2 Correct 10 ms 768 KB Output is correct
3 Correct 15 ms 1152 KB Output is correct
4 Correct 31 ms 1916 KB Output is correct
5 Correct 59 ms 3448 KB Output is correct
6 Correct 150 ms 6520 KB Output is correct
7 Correct 215 ms 12280 KB Output is correct