Submission #1204747

#TimeUsernameProblemLanguageResultExecution timeMemory
12047471binFloppy (RMI20_floppy)C++20
100 / 100
67 ms5704 KiB
#include<bits/stdc++.h>
#include "floppy.h"

using namespace std;

typedef long long ll;
#define all(v) v.begin(), v.end()

void dfs(int x, vector<int> & L, vector<int>& R, string& bits) {
    if (x == -1) return;
    bits += (L[x] != -1) + '0';
    bits += (R[x] != -1) + '0';
    dfs(L[x], L, R, bits);
    dfs(R[x], L, R, bits);
}

void read_array(int subtask_id, const vector<int> &v) {
    int n = v.size(), x;
    vector<vector<int>> adj(n, vector<int>());
    vector<int> L(n, -1), R(n, -1);
    stack<int> st;

    string bits = "";
    for (int i = 0; i < n; i++) {
        while (st.size() && v[st.top()] < v[i]) {
            int j = st.top(); st.pop();
            if (st.empty() || v[st.top()] > v[i]) L[i] = j;
            else R[st.top()] = j;
        }
        st.emplace(i);
    }
    while (st.size()) {
        x = st.top(); st.pop();
        if (st.size()) R[st.top()] = x;
    }

    dfs(x, L, R, bits);
    save_to_floppy(bits);
}

const int B = 1 << 16;
int t, cur;
pair<int, int> seg[B * 2];
void find(const string& bits, int v) {
    int tmp = t++;
    if (bits[tmp * 2] == '1') find(bits, v - 1);
    seg[B + cur] = {v, cur};
    cur++;
    if (bits[tmp * 2 + 1] == '1') find(bits, v - 1);
}

int Max(int l, int r) {
    l += B; r += B;
    pair<int, int> ret = {0, 0};
    while (l <= r) {
        if (l & 1) ret = max(ret, seg[l++]);
        if (!(r & 1)) ret = max(ret, seg[r--]);
        l >>= 1;r >>= 1;
    }
    return ret.second;
}

vector<int> solve_queries(int subtask_id, int N,
        const string &bits,
        const vector<int> &a, const std::vector<int> &b) {

    find(bits, N);
    vector<int> ans;
    for (int i = B - 1; i; i--) seg[i] = max(seg[i * 2], seg[i * 2 + 1]);
    for (int i = 0; i < a.size(); i++) ans.emplace_back(Max(a[i], b[i]));
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...