Cod sursa(job #2855810)

Utilizator megulolMegu Lol megulol Data 22 februarie 2022 22:32:45
Problema Arbori de intervale Scor 0
Compilator rs Status done
Runda Arhiva educationala Marime 2.2 kb
use std::io::BufRead;
use std::io::BufReader;
use std::io::Write;

fn maxim(a: usize, b: usize) -> usize {
    if a > b {a} else {b}
}

fn update(arb: &mut [usize], node: usize, left: usize, right: usize, pos: usize, val: usize) {
    if left == right { arb[node] = val; return; }
    let mid = left + (right - left) / 2;
    if pos <= mid {
        update(arb, 2 * node, left, mid, pos, val);
    } else {
        update(arb, 2 * node + 1, mid + 1, right, pos, val);
    }
    arb[node] = maxim(arb[2 * node], arb[2 * node + 1]);
}

fn query(arb: &[usize], node: usize, left: usize, right: usize, start: usize, finish: usize, max: &mut usize) {
    if start <= left && right <= finish {
        if *max < arb[node] {
            *max = arb[node];
        }
        return;
    }
    let mid = left + (right - left) / 2;
    if start <= mid {
        query(arb, 2 * node, left, mid, start, finish, max);
    }
    if right <= finish {
        query(arb, 2 * node + 1, mid + 1, right, start, finish, max);
    }
}

fn main() {
    let mut file = BufReader::new(std::fs::File::open("arbint.in").unwrap());
    let mut input = String::new();
    file.read_line(&mut input).unwrap();
    let (n, m) = input.trim().split_once(' ').unwrap();
    let n = n.parse::<usize>().unwrap();
    let m = m.parse::<usize>().unwrap();
    input.clear();
    file.read_line(&mut input).unwrap();
    let mut arb = vec![0; 4 * n + 1];
    for (i, number) in input.trim().split_whitespace().map(|s| s.parse::<usize>().unwrap()).enumerate() {
        update(&mut arb, 1, 1, n, i + 1, number);
    }
    let mut out = std::fs::File::create("arbint.out").unwrap();
    for _i in 0..m {
        input.clear();
        file.read_line(&mut input).unwrap();
        let mut iter = input.split_whitespace();
        let x = iter.next().unwrap();
        let a = iter.next().unwrap();
        let b = iter.next().unwrap();
        let x = x.parse::<usize>().unwrap();
        let a = a.parse::<usize>().unwrap();
        let b = b.parse::<usize>().unwrap();
        if x == 0 {
            let mut max = 0;
            query(&arb, 1, 1, n, a, b, &mut max);
            writeln!(out, "{}", max).unwrap();
        } else {
            update(&mut arb, 1, 1, n, a, b);
        }
    }
}