結果
問題 | No.875 Range Mindex Query |
ユーザー | ikd |
提出日時 | 2020-09-05 11:37:51 |
言語 | Rust (1.77.0 + proconio) |
結果 |
AC
|
実行時間 | 250 ms / 2,000 ms |
コード長 | 3,123 bytes |
コンパイル時間 | 16,923 ms |
コンパイル使用メモリ | 384,316 KB |
実行使用メモリ | 6,824 KB |
最終ジャッジ日時 | 2024-11-28 00:33:19 |
合計ジャッジ時間 | 21,076 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,820 KB |
testcase_01 | AC | 2 ms
6,820 KB |
testcase_02 | AC | 2 ms
6,820 KB |
testcase_03 | AC | 1 ms
6,816 KB |
testcase_04 | AC | 1 ms
6,816 KB |
testcase_05 | AC | 1 ms
6,820 KB |
testcase_06 | AC | 2 ms
6,820 KB |
testcase_07 | AC | 2 ms
6,816 KB |
testcase_08 | AC | 1 ms
6,820 KB |
testcase_09 | AC | 1 ms
6,816 KB |
testcase_10 | AC | 2 ms
6,816 KB |
testcase_11 | AC | 165 ms
6,820 KB |
testcase_12 | AC | 131 ms
6,816 KB |
testcase_13 | AC | 113 ms
6,820 KB |
testcase_14 | AC | 111 ms
6,816 KB |
testcase_15 | AC | 156 ms
6,820 KB |
testcase_16 | AC | 226 ms
6,816 KB |
testcase_17 | AC | 250 ms
6,824 KB |
testcase_18 | AC | 242 ms
6,820 KB |
ソースコード
struct ProconReader<R: std::io::Read> { reader: R, } impl<R: std::io::Read> ProconReader<R> { fn new(reader: R) -> Self { Self { reader } } fn get<T: std::str::FromStr>(&mut self) -> T { use std::io::Read; let buf = self .reader .by_ref() .bytes() .map(|b| b.unwrap()) .skip_while(|&byte| byte == b' ' || byte == b'\n' || byte == b'\r') .take_while(|&byte| byte != b' ' && byte != b'\n' && byte != b'\r') .collect::<Vec<_>>(); std::str::from_utf8(&buf) .unwrap() .parse() .ok() .expect("Parse Error.") } } struct SegmentTree<T, F> { n: usize, dat: Vec<T>, e: T, multiply: F, } impl<T, F> SegmentTree<T, F> where T: Copy, F: Fn(T, T) -> T, { fn new(n: usize, e: T, multiply: F) -> Self { let n = n.next_power_of_two(); Self { n, dat: vec![e; n * 2 - 1], e, multiply, } } fn get(&self, i: usize) -> T { self.dat[i + self.n - 1] } fn update(&mut self, i: usize, x: T) { let mut k = i + self.n - 1; self.dat[k] = x; while k > 0 { k = (k - 1) / 2; self.dat[k] = (self.multiply)(self.dat[k * 2 + 1], self.dat[k * 2 + 2]); } } fn fold(&self, range: std::ops::Range<usize>) -> T { self._fold(&range, 0, 0..self.n) } fn _fold( &self, range: &std::ops::Range<usize>, i: usize, i_range: std::ops::Range<usize>, ) -> T { if range.end <= i_range.start || i_range.end <= range.start { return self.e; } if range.start <= i_range.start && i_range.end <= range.end { return self.dat[i]; } let m = (i_range.start + i_range.end) / 2; (self.multiply)( self._fold(range, i * 2 + 1, i_range.start..m), self._fold(range, i * 2 + 2, m..i_range.end), ) } } fn main() { let stdin = std::io::stdin(); let mut rd = ProconReader::new(stdin.lock()); let n: usize = rd.get(); let q: usize = rd.get(); let a: Vec<usize> = (0..n).map(|_| rd.get()).collect(); let inf = std::usize::MAX; let mut seg = SegmentTree::new( n, (inf, inf), |(a, i), (b, j)| { if a <= b { (a, i) } else { (b, j) } }, ); for i in 0..n { seg.update(i, (a[i], i)); } for _ in 0..q { let t: usize = rd.get(); let l: usize = rd.get(); let r: usize = rd.get(); match t { 1 => { let (al, _) = seg.get(l - 1); let (ar, _) = seg.get(r - 1); seg.update(l - 1, (ar, l - 1)); seg.update(r - 1, (al, r - 1)); } 2 => { let (_, i) = seg.fold((l - 1)..r); println!("{}", i + 1); } _ => unreachable!(), } } }