# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
492337 | Pety | Floppy (RMI20_floppy) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include "floppy.h"
using namespace std;
int dp[17][40002];
void read_array(int subtask_id, const vector<int> &v) {
string bits;
stack<int>st;
st.push(-1);
for (int i = 0; i < v.size(); i++) {
while (st.top() != -1 && v[st.top()] < v[i]) {
bits += '0';
st.pop();
}
st.push(i);
bits += '1';
}
save_to_floppy(bits);
}
vector<int> solve_queries(int subtask_id, int N, const string bits, const vector<int>&a, const vector<int>&b) {
stack<int>st;
st.push(-1);
int ind = 0;
int ind2 = 0;
while (ind < N) {
while (bits[ind2] == '0') {
ind2++;
st.pop();
}
dp[0][ind + 1] = st.top() + 1;
st.push(ind);
ind2++;
ind++;
}
for (int i = 1; (1 << i) <= N; i++)
for (int j = 1; j <= N; j++)
dp[i][j] = dp[i - 1][dp[i - 1][j]];
vector<int>ans;
for (int i = 0; i < a.size(); i++) {
int poz = b[i] + 1;
for (int pas = 15; pas >= 0; pas--) {
if ((1 << pas) > N)
continue;
if (dp[pas][poz] >= a[i] + 1) {
poz = dp[pas][poz];
}
}
ans.push_back(poz - 1);
}
return ans;
}