This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,popcnt,sse4,abm")
#include <bits/stdc++.h>
// #include "lib1275.h"
using namespace std;
const int N = 1e5 + 5;
const int H = __lg(N);
int n, m, x, sz, ans, mx;
pair<int, int> seg[N << 1];
int a[N], l[N], r[N], pl[N], pr[N], id[N], to[H + 1][N << 1];
int bit[N];
inline void upd(int pos) {
for (; pos <= n; pos += pos & -pos) bit[pos]--;
}
inline int que(int k) {
int pos = 0, cnt = 0;
for (int i = __lg(n); i >= 0; i--) {
int nxt = pos + (1 << i);
if (nxt <= n && cnt + bit[nxt] < k) cnt += bit[pos = nxt];
}
return pos + 1;
}
int GetBestPosition(int _n, int _m, int _x, int _a[], int _l[], int _r[]) {
n = _n, m = _m, x = _x + 1;
for (int i = 1; i < n; i++) a[i] = _a[i - 1] + 1;
for (int i = 1; i <= m; i++) l[i] = _l[i - 1] + 1, r[i] = _r[i - 1] + 1;
for (int i = 1; i < n; i++) pl[i] = (a[i] > x ? i : pl[i - 1]);
pr[n] = n;
for (int i = n - 1; i >= 1; i--) pr[i] = (a[i] > x ? i : pr[i + 1]);
sz = n;
fill(bit + 1, bit + n + 1, 0);
for (int i = 1; i <= n; i++) {
bit[i]++;
seg[id[i] = i] = {i, i};
to[0][i] = 0;
if (i + (i & -i) <= n) bit[i + (i & -i)] += bit[i];
}
for (int i = 1; i <= m; i++) {
int L, R = que(r[i] + 1) - 1;
to[0][++sz] = 0;
seg[sz].second = R;
for (int j = r[i]; j >= l[i]; j--) {
L = que(j);
to[0][id[L]] = sz;
if (j > l[i]) upd(L);
R = L - 1;
}
id[L] = sz;
seg[sz].first = L;
}
for (int i = 1; i <= H; i++) for (int j = 1; j <= sz; j++) to[i][j] = to[i - 1][to[i - 1][j]];
ans = -1, mx = -1;
for (int i = 1; i <= n; i++) {
int L = pl[i - 1] + 1, R = pr[i], cnt = 0, pos = i;
for (int j = H; j >= 0; j--) {
int id = to[j][pos];
if (id && L <= seg[id].first && seg[id].second <= R) {
cnt += 1 << j;
pos = id;
}
}
if (cnt > mx) {
mx = cnt;
ans = i - 1;
}
}
return ans;
}
Compilation message (stderr)
tournament.cpp: In function 'int GetBestPosition(int, int, int, int*, int*, int*)':
tournament.cpp:53:23: warning: 'L' may be used uninitialized in this function [-Wmaybe-uninitialized]
53 | seg[sz].first = L;
| ~~~~~~~~~~~~~~^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |