Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int M = 1e2 + 10;
- int n, arr[M], seg[4 * M], big = 2e9, g[M], memo[M];
- map<int, vector<int>> mp;
- int build(int l, int r, int i) {
- if (l == r)
- seg[i] = arr[l];
- else
- seg[i] = min(build(l, (l + r) / 2, i * 2 + 1), build((l + r) / 2 + 1, r, i * 2 + 2));
- return seg[i];
- }
- int Min(int l, int r, int L, int R, int i) {
- if (L >= l && R <= r)
- return seg[i];
- if (L > r || R < l)
- return big;
- int mid = (L + R) / 2;
- return min(Min(l, r, L, mid, i * 2 + 1), Min(l, r, mid + 1, R, i * 2 + 2));
- }
- int q(int l, int r, int L, int R, int i) {
- if (L >= l && R <= r)
- return seg[i];
- if (L > r || R < l)
- return -1;
- return max(q(l, r, L, (L + R) / 2, i * 2 + 1), q(l, r, (L + R) / 2 + 1, R, i * 2 + 2));
- }
- int firstGreater(int l, int r, int x) {
- if (l == r)
- return (arr[l] > x ? l : -1);
- int mid = (l + r) / 2;
- if (q(l, mid, 0, n - 1, 0) > x)
- return firstGreater(l, mid, x);
- return firstGreater(mid + 1, r, x);
- }
- int solve(int i) {
- int &r = memo[i];
- if (r == -1) {
- if (g[i] == -1) {
- int j = firstGreater(0, n - 1, arr[i]);
- int k = -1;
- int mn = Min(i, n - 1, 0, n - 1, 0);
- if (1ll * mn * 2 < arr[i])
- k = mp[mn][lower_bound(mp[mn].begin(), mp[mn].end(), i) - mp[mn].begin()];
- if (k == -1) {
- mn = Min(0, j, 0, n - 1, 0);
- if (1ll * mn * 2 < arr[i])
- k = mp[mn][lower_bound(mp[mn].begin(), mp[mn].end(), 0) - mp[mn].begin()];
- }
- if (k != -1)
- if (k > i)
- r = k - i - 1;
- else
- r = n - i + k;
- else
- r = n - i + solve(j);
- } else {
- int k = -1;
- int mn = Min(i, g[i], 0, n - 1, 0);
- if (mn * 2 < arr[i])
- k = mp[mn][lower_bound(mp[mn].begin(), mp[mn].end(), i) - mp[mn].begin()];
- if (k != -1)
- r = k - i;
- else
- r = g[i] - i + solve(g[i]);
- }
- }
- return r;
- }
- int main() {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cin >> n;
- stack<pair<int, int>> s;
- memset(g, -1, sizeof g);
- memset(memo, -1, sizeof memo);
- for (int i = 0; i < n; i++) {
- cin >> arr[i];
- mp[arr[i]].push_back(i);
- while (!s.empty() && s.top().first < arr[i])
- g[s.top().second] = i, s.pop();
- s.push({arr[i], i});
- }
- // return 0;
- build(0, n - 1, 0);
- for (int i = 0; i < n; i++)
- cout << solve(i) << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement