Cod sursa(job #2751392)

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

fn main() {
    const NMAX : usize = 100007;
    let mut log2_array : [i32; NMAX] = [0; NMAX];

    log2_array[1] = 0;
    for i in 2..NMAX {
        log2_array[i] = 1 + log2_array[i / 2];
    }

    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 lg = log2_array[n] as usize + 1;

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

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

    for current_lg in 1..lg {
        let offset : usize = (1 << current_lg) >> 1;

        for i in 0..n-offset {
            rmq_structure[current_lg][i] = min(rmq_structure[current_lg - 1][i], rmq_structure[current_lg - 1][i + offset]);
        }
    }

    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();

        let x : usize = vars[0] - 1;
        let y : usize = vars[1] - 1;

        let interval_length : usize = y - x + 1;
        let structure_lg = log2_array[interval_length] as usize;

        let candidate1 = rmq_structure[structure_lg][x];
        let candidate2 = rmq_structure[structure_lg][y + 1 - (1 << structure_lg)];

        let best_candidate = min(candidate1, candidate2);
        write!(output, "{}\n", best_candidate).unwrap();
    }
}