This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub kmyk/competitive-programming-library
#define PROBLEM "https://judge.yosupo.jp/problem/cartesian_tree"
#include <cstdio>
#include <vector>
#include "../utils/macros.hpp"
#include "../graph/cartesian_tree.hpp"
int main(){
// input
int n; scanf("%d", &n);
std::vector<int> a(n);
REP (i, n) {
scanf("%d", &a[i]);
}
// solve
std::vector<int> p = construct_cartesian_tree(a);
// output
REP (i, n) {
printf("%d%c", p[i] == -1 ? i : p[i], i + 1 < n ? ' ' : '\n');
}
return 0;
}
#line 1 "graph/cartesian_tree.yosupo.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/cartesian_tree"
#include <cstdio>
#include <vector>
#line 2 "utils/macros.hpp"
#define REP(i, n) for (int i = 0; (i) < (int)(n); ++ (i))
#define REP3(i, m, n) for (int i = (m); (i) < (int)(n); ++ (i))
#define REP_R(i, n) for (int i = (int)(n) - 1; (i) >= 0; -- (i))
#define REP3R(i, m, n) for (int i = (int)(n) - 1; (i) >= (int)(m); -- (i))
#define ALL(x) std::begin(x), std::end(x)
#line 2 "graph/cartesian_tree.hpp"
#include <functional>
#line 5 "graph/cartesian_tree.hpp"
/**
* @brief Cartesian tree ($O(n)$)
* @note the smallest value is the root
* @note if a is not distinct, the way for tie-break is undefined
* @return the binary tree as the list of parents
*/
template <class T, class Comparator = std::less<int> >
std::vector<int> construct_cartesian_tree(const std::vector<T> & a, const Comparator & cmp = Comparator()) {
int n = a.size();
std::vector<int> parent(n, -1);
REP3 (i, 1, n) {
int p = i - 1; // parent of i
int l = -1; // left child of i
while (p != -1 and cmp(a[i], a[p])) {
int pp = parent[p]; // parent of parent of i
if (l != -1) {
parent[l] = p;
}
parent[p] = i;
l = p;
p = pp;
}
parent[i] = p;
}
return parent;
}
#line 6 "graph/cartesian_tree.yosupo.test.cpp"
int main(){
// input
int n; scanf("%d", &n);
std::vector<int> a(n);
REP (i, n) {
scanf("%d", &a[i]);
}
// solve
std::vector<int> p = construct_cartesian_tree(a);
// output
REP (i, n) {
printf("%d%c", p[i] == -1 ? i : p[i], i + 1 < n ? ' ' : '\n');
}
return 0;
}