Pagini recente » Cod sursa (job #168755) | Cod sursa (job #1535625) | Cod sursa (job #1271436) | Cod sursa (job #1125448) | Cod sursa (job #2751392)
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();
}
}