Pagini recente » Cod sursa (job #2596953) | Cod sursa (job #580871) | Cod sursa (job #1436864) | Cod sursa (job #167928) | Cod sursa (job #2751387)
use std::fs::File;
use std::io::{*};
use std::cmp::{min};
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 lg = (n as f64).log(2.0).floor() 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]);
}
}
println!("{:#?}", rmq_structure);
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 = (interval_length as f64).log(2.0).floor() 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);
writeln!(output, "{}", best_candidate).unwrap();
}
}