library-rs

This documentation is automatically generated by competitive-verifier/competitive-verifier

View the Project on GitHub naoya675/library-rs

:heavy_check_mark: Cartesian Tree (tree/cartesian-tree/src/lib.rs)

Description

Reference

Verified with

Code

#[derive(Debug, Clone)]
pub struct CartesianTree<T> {
    a: Vec<T>,
    n: usize,
    root: usize,
    parent: Vec<usize>,
    lchild: Vec<usize>,
    rchild: Vec<usize>,
}

impl<T: Copy + Ord + PartialOrd + PartialEq> CartesianTree<T> {
    pub fn new(a: Vec<T>) -> Self {
        let n = a.len();
        Self {
            a,
            n,
            root: n,
            parent: vec![n; n],
            lchild: vec![n; n],
            rchild: vec![n; n],
        }
    }

    pub fn run(&mut self, min: bool) -> Vec<usize> {
        let mut stack = vec![];
        for i in 0..self.n {
            let mut p = self.n;
            while !stack.is_empty() && !((self.a[i] < self.a[*stack.last().unwrap()]) ^ min) {
                if let Some(j) = stack.pop() {
                    self.rchild[j] = p;
                    p = j;
                }
            }
            if p != self.n {
                self.parent[p] = i;
            }
            if !stack.is_empty() {
                self.parent[i] = *stack.last().unwrap();
            }
            self.lchild[i] = p;
            stack.push(i);
        }
        for i in 0..stack.len() - 1 {
            self.rchild[stack[i]] = stack[i + 1];
        }
        self.root = stack[0];
        self.parent.clone()
    }
}

pub fn cartesian_tree<T: Copy + Ord + PartialOrd + PartialEq>(a: Vec<T>) -> Vec<usize> {
    let n = a.len();
    let mut parent = vec![n; n];
    let mut stack = vec![];
    for i in 0..n {
        let mut p = n;
        while !stack.is_empty() && a[i] < a[*stack.last().unwrap()] {
            p = stack.pop().unwrap();
        }
        if p != n {
            parent[p] = i;
        }
        if !stack.is_empty() {
            parent[i] = *stack.last().unwrap();
        }
        stack.push(i);
    }
    parent
}
Back to top page