Pagini recente » Cod sursa (job #2418315) | Cod sursa (job #2750798) | Cod sursa (job #2357734) | Cod sursa (job #62149) | Cod sursa (job #2751408)
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();
}
}