Submission details
Task:Dynamic Range Minimum Queries
Sender:Giaco
Submission time:2025-09-24 14:20:34 +0300
Language:Rust (2021)
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.00 sdetails
#2ACCEPTED0.21 sdetails

Compiler report

warning: unused import: `max`
 --> input/code.rs:1:16
  |
1 | use std::cmp::{max, min};
  |                ^^^
  |
  = note: `#[warn(unused_imports)]` on by default

warning: unused imports: `HashMap`, `HashSet`
 --> input/code.rs:2:24
  |
2 | use std::collections::{HashMap, HashSet};
  |                        ^^^^^^^  ^^^^^^^

warning: 2 warnings emitted

Code

use std::cmp::{max, min};
use std::collections::{HashMap, HashSet};
use std::io::{self, Read};

macro_rules! input {
    ($it: expr) => {
        $it.next().unwrap().parse().unwrap()
    };
    ($it: expr, $T: ty) => {
        $it.next().unwrap().parse::<$T>().unwrap()
    };
}
/*
mod classes;
mod homework;

fn main() {
    // println!("{}", "-".repeat(20));
    // classes::c07::task4();
    homework::hw3::task1();
    // println!("{}", "-".repeat(20));
}
// */

fn closest_pow_of_2(n: &usize) -> usize {
    let mut x = 1;
    while x<*n {
        x*=2;
    }
    x
}

fn min_query(mut a: usize, mut b:usize, t: &Vec<usize>) -> usize {
    let n=t.len()/2;
    a+=n-1; // input is 1 indexed
    b+=n-1; // input is 1 indexed
    let mut rtn = 10usize.pow(10);
    while a<= b {
        if a%2 == 1 {
            rtn = min(t[a], rtn);
            a+=1;
        }
        if b%2 == 0 {
            rtn = min(t[b], rtn);
            b-=1;
        }
        a/=2;
        b/=2;
    }
    rtn
}

fn update(mut k: usize, u:usize, t: &mut Vec<usize>) {
    let n=t.len()/2;
    k= k + n - 1; // input is 1 indexed
    t[k] = u;
    k/=2;
    while k>0 {
        t[k] = min(t[k*2], t[k*2+1]);
        k/=2;
    }
}

fn main() {
    let mut buf = String::new();
    io::stdin().read_to_string(&mut buf).unwrap();

    let mut it = buf.split_whitespace();

    let  (n, mut q): (usize, usize) = (input!(it), input!(it));

    let n_pow_2 = closest_pow_of_2(&n);

    let mut t = vec![10usize.pow(10); 2*n_pow_2];

    for i in 0..n {
        t[n_pow_2+i] = input!(it);
    }

    for i in (0..n_pow_2).rev() {
        t[i] = min(t[2 * i], t[2 * i + 1]);
    }

    while q>0 {
        q-=1;
        let  (op, a, b): (usize, usize, usize) = (input!(it), input!(it), input!(it));
        match op {
            1 => update(a, b, &mut t),
            2 => println!("{}", min_query(a, b, &mut t)),
            _ => todo!(),
        }
    }
}


Test details

Test 1

Verdict: ACCEPTED

input
8 80
7 6 4 6 2 9 4 8
2 1 1
2 1 2
2 1 3
...

correct output
7
6
4
4
2
...

user output
7
6
4
4
2
...
Truncated

Test 2

Verdict: ACCEPTED

input
200000 200000
398739055 65343131 699208332 3...

correct output
28609
129890
20378
20378
311522
...

user output
28609
129890
20378
20378
311522
...
Truncated