#ifndef hwe
#include "floppy.h"
#endif
#include <bits/stdc++.h>
using namespace std;
#define POPCOUNT(n) (__builtin_popcountll((n)))
#define CLZ(n) (__builtin_clzll((n)))
#define CTZ(n) (__builtin_ctzll((n)))
#define LOG(n) (63 - __builtin_clzll((n)))
#define BIT(n, i) (((n) >> (i)) & 1ll)
#define MASK(i) (1ll << (i))
#define FLIP(n, i) ((n) ^ (1ll << (i)))
#define ON(n, i) ((n) | MASK(i))
#define OFF(n, i) ((n) & ~MASK(i))
#define Int __int128
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<long long, long long> pll;
typedef pair<long long, int> pli;
typedef pair<int, long long> pil;
typedef vector<pair<int, int>> vii;
typedef vector<pair<long long, long long>> vll;
typedef vector<pair<long long, int>> vli;
typedef vector<pair<int, long long>> vil;
template <class T1, class T2> bool maximize(T1 &x, T2 y) {
if (x < y) {
x = y;
return true;
}
return false;
}
template <class T1, class T2> bool minimize(T1 &x, T2 y) {
if (x > y) {
x = y;
return true;
}
return false;
}
template <class T> void remove_duplicate(vector<T> &ve) {
sort (ve.begin(), ve.end());
ve.resize(unique(ve.begin(), ve.end()) - ve.begin());
}
mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
template <class T1, class T2> T1 random(T1 l, T2 r) {
return uniform_int_distribution<T1>(l, r)(rng);
}
template <class T> T random(T r) {
return rng() % r;
}
const int N = 1e6 + 5, LG = 18;
const int MOD = 1e9 + 7;
const int inf = 1e9;
const long long INF = 1e18;
vector<int> pre[LG];
#ifdef hwe
void save_to_floppy(const string &bits);
#endif
void read_array(int subtask_id, const vector<int> &v) {
stack<int> st; string bits = "";
for (int i = 0; i < v.size(); ++i) {
while (!st.empty() && v[i] > v[st.top()]) {
st.pop(), bits += '0';
}
st.emplace(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) {
for (int i = 0; i < LG; ++i) pre[i].assign(n, -1);
stack<int> st;
for (int i = 0, j = 0; i < n; ++i) {
while (bits[j] == '0') st.pop(), ++j;
if (!st.empty()) pre[0][i] = st.top();
st.emplace(i), ++j;
}
for (int i = 1; i < LG; ++i) for (int j = 0; j < n; ++j) {
if (pre[i - 1][j] == -1) pre[i][j] = -1;
else pre[i][j] = pre[i - 1][pre[i - 1][j]];
}
vector<int> ans(a.size(), -1);
for (int i = 0; i < a.size(); ++i) {
int l = a[i], r = b[i];
for (int j = LG - 1; j >= 0; --j) {
int nxt = pre[j][r];
if (nxt >= l) r = nxt;
}
ans[i] = r;
}
return ans;
}
#ifdef hwe
namespace Grader {
#define NMAX 100000
#define MMAX 100000
int subtask_id, N, M;
vector<int> v, sorted_v;
vector<int> a, b;
vector<int> correct_answers;
// Print score to stdout and exit.
void score_and_exit(const double pts, const char *verdict) {
fprintf(stderr, "%s", verdict);
fprintf(stdout, "%f", pts);
exit(0);
}
// Contestant sent too many bits.
void too_many_bits() {
score_and_exit(0, "Too many stored bits!");
}
// Contestant did not send any bits.
void misformatted_stored_bits() {
score_and_exit(0, "Misformatted stored bits or save_to_floppy not called!");
}
// Contestant did not call the answer function.
void answer_not_provided() {
score_and_exit(0, "Answer not provided!");
}
// Contestant sent a wrong answer.
void wrong_answer() {
score_and_exit(0, "Wrong answer to query!");
}
// Contestant sent a correct answer.
void correct_answer() {
score_and_exit(1, "OK!");
}
void read_test() {
assert(scanf("%d", &subtask_id) == 1);
assert(scanf("%d%d", &N, &M) == 2);
assert(1 <= N && N <= NMAX);
assert(0 <= M && M <= MMAX);
v.resize(N);
for (int i = 0; i < N; ++i) {
assert(scanf("%d", &v[i]) == 1);
}
// Check all values are distinct.
sorted_v.resize(N);
for (int i = 0; i < N; ++i) {
sorted_v[i] = v[i];
}
sort(sorted_v.begin(), sorted_v.end());
for (int i = 0; i + 1 < N; ++i) {
assert(sorted_v[i] < sorted_v[i + 1]);
}
a.resize(M);
b.resize(M);
correct_answers.resize(M);
for (int i = 0; i < M; ++i) {
assert(scanf("%d%d%d", &a[i], &b[i], &correct_answers[i]) == 3);
assert(0 <= a[i] && a[i] <= correct_answers[i] &&
correct_answers[i] <= b[i] && b[i] < N);
}
}
void save_to_floppy(const string &bits) {
vector<int> contestant_answers = solve_queries(subtask_id, N, bits, a, b);
for (int i = 0; i < M; ++i) {
if (contestant_answers[i] != correct_answers[i]) {
wrong_answer();
}
}
correct_answer();
exit(0);
}
void test() {
// Read input data.
read_test();
// Send subtask_id, v.
read_array(subtask_id, v);
answer_not_provided();
}
}
void save_to_floppy(const string &bits) {
Grader::save_to_floppy(bits);
}
signed main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
Grader::test();
cerr << '\n'; return 0;
}
#endif
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |