Submission #343922

#TimeUsernameProblemLanguageResultExecution timeMemory
343922flappybirdmedians (balkan11_medians)C++14
90 / 100
191 ms22764 KiB
#include <bits/stdc++.h> using namespace std; #define MAX 202020 int l[MAX], r[MAX]; int tree[MAX]; int arr[MAX]; int s; vector<int>ans; set<int>S; void init(int x = 1) { if (x >= s) { l[x] = r[x] = x - s + 1; return; } init(x * 2); init(x * 2 + 1); l[x] = l[x * 2]; r[x] = r[x * 2 + 1]; } void update(int loc) { ans.push_back(loc); arr[loc] = 1; S.erase(loc); loc += s - 1; while (loc > 0) { tree[loc]++; loc /= 2; } } int sumquery(int low, int high, int loc = 1) { if (l[loc] == low && r[loc] == high) return tree[loc]; else if (r[loc * 2] >= high) return sumquery(low, high, loc * 2); else if (l[loc * 2 + 1] <= low) return sumquery(low, high, loc * 2 + 1); else return sumquery(low, r[loc * 2], loc * 2) + sumquery(l[loc * 2 + 1], high, loc * 2 + 1); } int minn() { return *S.begin(); } int maxn() { set<int>::iterator it; it = S.end(); it--; return *it; } int main(void) { int N; cin >> N; s = 1 << (int)ceil(log2(2 * N - 1)); int i; for (i = 1; i <= 2 * N - 1; i++) S.insert(i); init(); int a; cin >> a; update(a); for (i = 1; i <= N - 1; i++) { cin >> a; if (arr[a] == 0) update(a); while (sumquery(1, a) < (i + 1)) update(minn()); while (sumquery(a, 2 * N - 1) < (i + 1)) update(maxn()); } for (auto i : ans) cout << i << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...