mod data_structure {
pub struct CartesianTree<T: Copy + Ord> {
val: Vec<T>,
par: Vec<Option<usize>>,
left: Vec<Option<usize>>,
right: Vec<Option<usize>>,
}
impl<T: Copy + Ord> CartesianTree<T> {
pub fn new(val: Vec<T>) -> Self {
Self::build(val)
}
fn build(val: Vec<T>) -> Self {
let n = val.len();
let mut par = vec![None; n];
let mut left = vec![None; n];
let mut right = vec![None; n];
let mut stack = Vec::with_capacity(n);
for i in 0..n {
let mut last = None;
while let Some(index) = stack.pop() {
if val[index] >= val[i] {
last = Some(index);
} else {
stack.push(index);
break;
}
}
if let Some(last) = last {
left[i] = Some(last);
par[last] = Some(i);
}
if !stack.is_empty() {
let p = *stack.last().unwrap();
par[i] = Some(p);
right[p] = Some(i);
}
stack.push(i);
}
Self {
val,
par,
left,
right,
}
}
pub fn get_par_index(&self, i: usize) -> Option<usize> {
self.par[i]
}
pub fn get_left_index(&self, i: usize) -> Option<usize> {
self.left[i]
}
pub fn get_right_index(&self, i: usize) -> Option<usize> {
self.right[i]
}
pub fn get_par_value(&self, i: usize) -> Option<T> {
if let Some(par) = self.par[i] {
Some(self.val[par])
} else {
None
}
}
pub fn get_left_value(&self, i: usize) -> Option<T> {
if let Some(left) = self.left[i] {
Some(self.val[left])
} else {
None
}
}
pub fn get_right_value(&self, i: usize) -> Option<T> {
if let Some(right) = self.right[i] {
Some(self.val[right])
} else {
None
}
}
}
}