Submission #65814623


Source Code Expand

use proconio::input;

const HEIGHT: usize = 30;

fn main() {
    input! {
        q: usize,
        queries: [usize; q],
    }
    let mut root = SegtreeNode {
        children: [None, None],
        value: Value {
            sum: [0, 0],
            parity: 0,
        },
    };
    let mut prev_ans = 0;
    for &query in &queries {
        let query = (prev_ans + query) % 1_000_000_000 + 1;
        root.insert(query, HEIGHT);
        let ans = root.value.sum[0];
        println!("{ans}");
        prev_ans = ans;
    }
}

#[derive(PartialEq, Eq, Clone, Copy)]
struct Value {
    sum: [usize; 2],
    parity: usize,
}
impl std::fmt::Debug for Value {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.debug_tuple("")
            .field(&self.sum)
            .field(&self.parity)
            .finish()
    }
}

#[derive(Debug, PartialEq, Eq, Clone)]
struct SegtreeNode {
    children: [Option<Box<SegtreeNode>>; 2],
    value: Value,
}
impl SegtreeNode {
    fn insert(&mut self, query: usize, height: usize) {
        if height == 0 {
            self.value.sum[self.value.parity] += query;
            self.value.parity ^= 1;
            return;
        }
        let dir = (query >> (height - 1)) & 1;
        if self.children[dir].is_none() {
            self.children[dir] = Some(Box::new(SegtreeNode {
                children: [None, None],
                value: Value {
                    sum: [0, 0],
                    parity: 0,
                },
            }));
        }
        let child = self.children[dir].as_mut().unwrap();
        child.insert(query, height - 1);
        let value = [
            self.children[0].as_ref().map_or([0, 0], |c| c.value.sum),
            self.children[1].as_ref().map_or([0, 0], |c| c.value.sum),
        ];
        let parity = [
            self.children[0].as_ref().map_or(0, |c| c.value.parity),
            self.children[1].as_ref().map_or(0, |c| c.value.parity),
        ];
        self.value.sum = [
            value[0][0] + value[1][parity[0]],
            value[0][1] + value[1][1 ^ parity[0]],
        ];
        self.value.parity = parity[0] ^ parity[1];
    }
}

Submission Info

Submission Time
Task G - Odd Position Sum Query
User ngtkana
Language Rust (rustc 1.70.0)
Score 600
Code Size 2248 Byte
Status AC
Exec Time 895 ms
Memory 200052 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 2
AC × 47
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_test_00.txt, 01_test_01.txt, 01_test_02.txt, 01_test_03.txt, 01_test_04.txt, 01_test_05.txt, 01_test_06.txt, 01_test_07.txt, 01_test_08.txt, 01_test_09.txt, 01_test_10.txt, 01_test_11.txt, 01_test_12.txt, 01_test_13.txt, 01_test_14.txt, 01_test_15.txt, 01_test_16.txt, 01_test_17.txt, 01_test_18.txt, 01_test_19.txt, 01_test_20.txt, 01_test_21.txt, 01_test_22.txt, 01_test_23.txt, 01_test_24.txt, 01_test_25.txt, 01_test_26.txt, 01_test_27.txt, 01_test_28.txt, 01_test_29.txt, 01_test_30.txt, 01_test_31.txt, 01_test_32.txt, 01_test_33.txt, 01_test_34.txt, 01_test_35.txt, 01_test_36.txt, 01_test_37.txt, 01_test_38.txt, 01_test_39.txt, 01_test_40.txt, 01_test_41.txt, 01_test_42.txt, 01_test_43.txt, 01_test_44.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 1972 KiB
00_sample_01.txt AC 1 ms 1944 KiB
01_test_00.txt AC 0 ms 2024 KiB
01_test_01.txt AC 0 ms 1944 KiB
01_test_02.txt AC 0 ms 1964 KiB
01_test_03.txt AC 1 ms 2144 KiB
01_test_04.txt AC 1 ms 2224 KiB
01_test_05.txt AC 2 ms 2364 KiB
01_test_06.txt AC 15 ms 7508 KiB
01_test_07.txt AC 4 ms 3528 KiB
01_test_08.txt AC 46 ms 16664 KiB
01_test_09.txt AC 282 ms 71108 KiB
01_test_10.txt AC 538 ms 125680 KiB
01_test_11.txt AC 427 ms 112652 KiB
01_test_12.txt AC 895 ms 190628 KiB
01_test_13.txt AC 794 ms 190508 KiB
01_test_14.txt AC 245 ms 6564 KiB
01_test_15.txt AC 381 ms 10124 KiB
01_test_16.txt AC 273 ms 7396 KiB
01_test_17.txt AC 383 ms 10132 KiB
01_test_18.txt AC 356 ms 9188 KiB
01_test_19.txt AC 388 ms 10136 KiB
01_test_20.txt AC 251 ms 7168 KiB
01_test_21.txt AC 410 ms 10992 KiB
01_test_22.txt AC 408 ms 17136 KiB
01_test_23.txt AC 512 ms 18308 KiB
01_test_24.txt AC 532 ms 69304 KiB
01_test_25.txt AC 661 ms 74604 KiB
01_test_26.txt AC 864 ms 200052 KiB
01_test_27.txt AC 842 ms 199984 KiB
01_test_28.txt AC 823 ms 195376 KiB
01_test_29.txt AC 867 ms 195432 KiB
01_test_30.txt AC 810 ms 198112 KiB
01_test_31.txt AC 889 ms 198060 KiB
01_test_32.txt AC 641 ms 97232 KiB
01_test_33.txt AC 736 ms 96608 KiB
01_test_34.txt AC 576 ms 190548 KiB
01_test_35.txt AC 623 ms 190572 KiB
01_test_36.txt AC 580 ms 190424 KiB
01_test_37.txt AC 619 ms 190616 KiB
01_test_38.txt AC 596 ms 190452 KiB
01_test_39.txt AC 597 ms 190488 KiB
01_test_40.txt AC 599 ms 190384 KiB
01_test_41.txt AC 593 ms 190596 KiB
01_test_42.txt AC 1 ms 2036 KiB
01_test_43.txt AC 378 ms 7500 KiB
01_test_44.txt AC 386 ms 10268 KiB