제출 #1345465

#제출 시각아이디문제언어결과실행 시간메모리
1345465SzymonKrzywdaEditor (BOI15_edi)C++20
0 / 100
97 ms54552 KiB
#include <iostream>
#include <vector>
#include <set>

using namespace std;
using vi = vector<int>;
using pii = pair<int, int>;
using vpii = vector<pii>;
const int MAXN = 3e5 + 7;

#define ff first 
#define ss second 

const int base = 1 << 19;

int tree[base * 2]; // wierzcholek min czyli min po czasie

int query(int l, int r) {
    l += base - 1;
    r += base + 1;

    int ans = 1e9;
    while (l / 2 != r / 2) {
        if (l % 2 == 0) ans = min(ans, tree[l + 1]);
        if (r % 2 == 1) ans = min(ans, tree[r - 1]);
        l /= 2;
        r /= 2;
    }
    return ans;
}

set<int> events[base]; //eventy dla danego rank'u

void update(int rank, int time) {
    if (events[rank].find(time) != events[rank].end()) events[rank].erase(time);
    else events[rank].insert(time);

    int v = rank;
    v += base;
    tree[v] = 1e9;
    if (events[rank].size()) tree[v] = *events[rank].begin();

    v /= 2;
    while (v) {
        tree[v] = min(tree[v * 2], tree[v * 2 + 1]);
        v /= 2;
    }
}


vi graf[MAXN];
int xorr[MAXN];
int ranks[MAXN];

int main() {
    ios_base::sync_with_stdio(0);   
    cin.tie(0);
    for (int i = 0; i < base * 2; i++) tree[i] = 1e9;
    int n;
    cin >> n;

    vi tab(n);
    vi rooty(n);
    for (int & val : tab) cin >> val;

    int anss = 0;

    for (int i = n - 1; i >= 0; i--) {
        xorr[i] = 1;
        ranks[i] = -tab[i];
        if (ranks[i] < 0) ranks[i] = 0;
        while (xorr[i]) {
            int v = query(ranks[i] + 1, base - 1);
            if (v >= n) break;
            update(ranks[v], v);
            graf[i].push_back(v);
            xorr[i] ^= xorr[v];
        }
        update(ranks[i], i);

        if (ranks[i] == 0 && xorr[i] && !anss) anss = tab[i];
    }


    for (int i = 0; i < n - 1; i++) cout << n << '\n';
    cout << anss << '\n';


    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...