Cod sursa(job #2751408)

Utilizator redstonegamer22Andrei Ion redstonegamer22 Data 14 mai 2021 22:26:45
Problema Range minimum query Scor 100
Compilator rs Status done
Runda Arhiva educationala Marime 2.01 kb
use std::fs::File;
use std::io::{*};
use std::cmp::min;

struct RMQ {
    log2 : Vec<i32>,
    data : Vec<Vec<i32>>,
}

impl RMQ {
    fn new(init_data : Vec<i32>) -> RMQ {
        let n : usize = init_data.len();
        let mut log2 : Vec<i32> = vec![0; n + 1];

        for i in 2..n+1 {
            log2[i] = 1 + log2[i / 2];
        }

        let log_n = log2[n] as usize + 1;

        let mut data : Vec<Vec<i32>> = vec![vec![]; log_n];
        data[0] = init_data;

        for current_log in 1..log_n {
            let offset : usize = (1 << current_log) >> 1;

            for i in 0..data[current_log - 1].len() - offset {
                let value = min(data[current_log - 1][i], data[current_log - 1][i + offset]);
                data[current_log].push(value);
            }
        }

        RMQ { log2 : log2, data : data }
    }

    fn query(&self, x : usize, y : usize) -> i32 {
        let interval_length = y - x + 1;
        let structure_log = self.log2[interval_length] as usize;

        let candidate1 = self.data[structure_log][x];
        let candidate2 = self.data[structure_log][y + 1 - (1 << structure_log)];

        min(candidate1, candidate2)
    }
}

fn main() {
    let mut input = BufReader::new(File::open("rmq.in").unwrap());
    let mut output = BufWriter::new(File::create("rmq.out").unwrap());

    let mut line = String::new();
    input.read_line(&mut line).unwrap();
    let vars : Vec<usize> = line.trim().split(" ").map(|x| x.parse().unwrap()).collect();

    let n = vars[0];
    let q = vars[1];

    let mut init_data : Vec<i32> = vec![0; n];

    for i in 0..n {
        line.clear();
        input.read_line(&mut line).unwrap();
        init_data[i] = line.trim().parse().unwrap();
    }

    let rmq : RMQ = RMQ::new(init_data);

    for _query in 0..q {
        line.clear();
        input.read_line(&mut line).unwrap();
        let vars : Vec<usize> = line.trim().split(" ").map(|x| x.parse().unwrap()).collect();

        write!(output, "{}\n", rmq.query(vars[0] - 1, vars[1] - 1)).unwrap();
    }
}