結果
問題 | No.789 範囲の合計 |
ユーザー |
|
提出日時 | 2025-01-16 07:14:22 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 101 ms / 1,000 ms |
コード長 | 12,943 bytes |
コンパイル時間 | 11,906 ms |
コンパイル使用メモリ | 401,864 KB |
実行使用メモリ | 45,056 KB |
最終ジャッジ日時 | 2025-01-16 07:14:46 |
合計ジャッジ時間 | 14,939 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 15 |
ソースコード
#[allow(unused_imports)]use std::{collections::{*},cmp::{Reverse, Ordering, Ord, PartialOrd, PartialEq},mem::{swap},time::Instant,fs::File,io::{self, stdin, read_to_string},hash::Hash,};#[allow(unused_imports)]use crate::input::{Usize1, Chars};pub fn bit_length(x: usize)->usize{64-x.saturating_sub(1).leading_zeros()as usize}pub trait SegTreeMonoid{type S: Copy;fn identity()->Self::S;fn op(a: &Self::S, b: &Self::S)->Self::S;}pub struct DynamicSegmenttree<M> where M: SegTreeMonoid{n: usize,data: Vec<(M::S, Option<usize>, Option<usize>)>,}impl<M> DynamicSegmenttree<M> where M: SegTreeMonoid{pub fn new(n: usize)->Self{let n = n.next_power_of_two();DynamicSegmenttree{n, data: vec![(M::identity(), None, None)]}}pub fn set(&mut self, p: usize, x: M::S){self.update_dfs(0, 0, self.n, p, x, false);}pub fn push(&mut self, p: usize, x: M::S){self.update_dfs(0, 0, self.n, p, x, true);}fn update_dfs(&mut self, p: usize, l: usize, r: usize, idx: usize, x: M::S, f: bool)->M::S{if l+1==r{let (pre, left, right) = self.data[p];if f{self.data[p] = (M::op(&pre, &x), left, right);} else {self.data[p] = (x, left, right);}return self.data[p].0;}let (_, mut left, mut right) = self.data[p];let m = (l+r)/2;let res = if idx < m{let res_l = if let Some(ln) = left{self.update_dfs(ln, l, m, idx, x, f)} else {let nex = self.data.len();left = Some(nex);self.data.push((M::identity(), None, None));self.update_dfs(nex, l, m, idx, x, f)};let res_r = if let Some(rn) = right{self.data[rn].0} else {M::identity()};M::op(&res_l, &res_r)} else {let res_l = if let Some(ln) = left{self.data[ln].0} else {M::identity()};let res_r = if let Some(rn) = right{self.update_dfs(rn, m, r, idx, x, f)} else {let nex = self.data.len();right = Some(nex);self.data.push((M::identity(), None, None));self.update_dfs(nex, m, r, idx, x, f)};M::op(&res_l, &res_r)};self.data[p] = (res, left, right);res}pub fn prod(&self, l: usize, r: usize)->M::S{self.prod_dfs(0, 0, self.n, l, r)}fn prod_dfs(&self, p: usize, l: usize, r: usize, x: usize, y: usize)->M::S{if r <= x||y <= l{return M::identity();}let (z, left, right) =self.data[p];if x <= l && r <= y{return z;}let m = (l+r)/2;let res_l = if let Some(ln) = left{self.prod_dfs(ln, l, m, x, y)} else {M::identity()};let res_r = if let Some(rn) = right{self.prod_dfs(rn, m, r, x, y)} else {M::identity()};M::op(&res_l, &res_r)}pub fn max_right<F>(&self, l: usize, f: F)->usize where F: Fn(&M::S)->bool{assert!(f(&M::identity()));if l==self.n{return self.n}let mut ac = M::identity();self.max_right_dfs(0, 0, self.n, l, &mut ac, &f)}fn max_right_dfs<F>(&self, p: usize, l: usize, r: usize, x: usize, ac: &mut M::S, f: &F)->usize where F: Fn(&M::S)->bool{if r <= x{return x}if l >= x{let res = M::op(ac, &self.data[p].0);if f(&res){*ac = res;return r;} else if r-l==1{return l;}}let m = (l+r)/2;let (_, left, right) = self.data[p];let ret = if let Some(ln) = left{self.max_right_dfs(ln, l, m, x, ac, f)} else {x};if ret < m{return ret;} else if let Some(rn) = right{self.max_right_dfs(rn, m, r, x, ac, f)} else {r}}pub fn min_left<F>(&self, r: usize, f: F)->usize where F: Fn(&M::S)->bool{assert!(f(&M::identity()));if r==0{return 0;}let mut ac = M::identity();self.min_left_dfs(0, 0, self.n, r, &mut ac, &f)}fn min_left_dfs<F>(&self, p: usize, l: usize, r: usize, x: usize, ac: &mut M::S, f: &F)->usize where F: Fn(&M::S)->bool{if x <= l{return l;} else if r <= x{let res = M::op(&self.data[p].0, ac);if f(&res){*ac = res;return l;} else if l+1==r{return r;}}let m = (l+r)/2;let (_, left, right) = self.data[p];let ret = if let Some(rn) = right{self.min_left_dfs(rn, m, r, x, ac, f)} else {m};if ret > m{ret} else if let Some(ln) = left{self.min_left_dfs(ln, l, m, x, ac, f)} else {l}}pub fn all_prod(&self)->M::S{self.data[0].0}}struct M;impl SegTreeMonoid for M{type S = usize;fn identity() -> Self::S {0}fn op(&a: &Self::S, &b: &Self::S) -> Self::S {a+b}}// qryxipさんのコードをお借りしています!!ありがとうございます!!fn main() {let __fastout_stdout = ::std::io::stdout();let __fastout_stdout = &mut ::std::io::BufWriter::new(__fastout_stdout.lock());#[allow(unused_macros)]macro_rules ! print{($ ($ tt : tt) *) =>{{use std :: io :: Write as _ ; :: std :: write !(__fastout_stdout, $ ($ tt) *) . unwrap () ;}};}#[allow(unused_macros)]macro_rules ! println{($ ($ tt : tt) *) =>{{use std :: io :: Write as _ ; :: std :: writeln !(__fastout_stdout, $ ($ tt) *) . unwrap ();}} ;}let __fastout_res = {// 本体コードはここからinput!{n: usize,query: [(usize, usize, usize); n],}let mut segtree = DynamicSegmenttree::<M>::new(1000000001);let mut ans = 0;for &(p, x, y) in &query{if p==0{segtree.push(x, y);} else {let res = segtree.prod(x, y+1);ans += res;}}std::println!("{}", ans);// 本体コードここまで};<::std::io::BufWriter<_> as ::std::io::Write>::flush(__fastout_stdout).unwrap();__fastout_res}#[allow(unused)]pub mod input {pub use crate::{input, input_inner, read, readable};use std::{cell::RefCell,fmt::Debug,io::{self, BufRead, Read},rc::Rc,str::{FromStr, SplitWhitespace},};#[macro_export]macro_rules! input {(from $scanner:ident; $($tt:tt)*) => {$crate::input::input_inner!(@scanner($scanner), @tts($($tt)*))};($($tt:tt)*) => {let __scanner = $crate::input::DEFAULT_SCANNER.with(|__scanner| __scanner.clone());let mut __scanner_ref = __scanner.borrow_mut();if let $crate::input::Scanner::Uninited = *__scanner_ref {*__scanner_ref = $crate::input::Scanner::stdin_auto().unwrap();}$crate::input::input_inner!(@scanner(__scanner_ref), @tts($($tt)*));::std::mem::drop(__scanner_ref);::std::mem::drop(__scanner);};}#[macro_export]macro_rules! input_inner {(@scanner($scanner:ident), @tts()) => {};(@scanner($scanner:ident), @tts(mut $single_tt_pat:tt : $readable:tt)) => {let mut $single_tt_pat = $crate::input::read!(from $scanner { $readable });};(@scanner($scanner:ident), @tts($single_tt_pat:tt : $readable:tt)) => {let $single_tt_pat = $crate::input::read!(from $scanner { $readable });};(@scanner($scanner:ident), @tts(mut $single_tt_pat:tt : $readable:tt, $($rest:tt)*)) => {$crate::input::input_inner!(@scanner($scanner), @tts(mut $single_tt_pat: $readable));$crate::input::input_inner!(@scanner($scanner), @tts($($rest)*));};(@scanner($scanner:ident), @tts($single_tt_pat:tt : $readable:tt, $($rest:tt)*)) => {$crate::input::input_inner!(@scanner($scanner), @tts($single_tt_pat: $readable));$crate::input::input_inner!(@scanner($scanner), @tts($($rest)*));};}#[macro_export]macro_rules! read {(from $scanner:ident { [$tt:tt] }) => {$crate::input::read!(from $scanner { [$tt; $crate::read!(from $scanner { usize })] })};(from $scanner:ident { [$tt:tt; $n:expr] }) => {(0..$n).map(|_| $crate::input::read!(from $scanner { $tt })).collect::<Vec<_>>()};(from $scanner:ident { ($($tt:tt),+) }) => {($($crate::read!(from $scanner { $tt })),*)};(from $scanner:ident { $ty:ty }) => {<$ty as $crate::input::Readable>::read_from_scanner(&mut $scanner)};}#[macro_export]macro_rules! readable {($name:ident; |$scanner:ident| { $($body:tt)* }) => {$crate::input::readable!($name; |$scanner| -> () { $($body)* });};($name:ident; |$scanner:ident| $expr:expr) => {$crate::input::readable!($name; |$scanner| -> () { $expr });};($name:ident; |$scanner:ident| -> $output:ty { $($body:tt)* }) => {enum $name {}impl $crate::input::Readable for $name {type Output = $output;fn read_from_scanner(mut $scanner: &mut $crate::input::Scanner) -> $output {$($body)*}}};}pub enum Scanner {Uninited,Once {words: SplitWhitespace<'static>,},Lines {rdr: Box<dyn BufRead>,words: SplitWhitespace<'static>,},}impl Scanner {pub fn stdin_auto() -> io::Result<Self> {if cfg!(debug_assertions) {Ok(Self::lines(Box::leak(Box::new(io::stdin())).lock()))} else {Self::once(io::stdin())}}pub fn once<R: Read>(mut rdr: R) -> io::Result<Self> {let mut buf = String::with_capacity(1024);rdr.read_to_string(&mut buf)?;let words = Box::leak(buf.into_boxed_str()).split_whitespace();Ok(Self::Once { words })}pub fn lines<R: BufRead + 'static>(rdr: R) -> Self {Self::Lines {rdr: Box::new(rdr),words: "".split_whitespace(),}}pub fn parse_next_unwrap<T: FromStr>(&mut self) -> TwhereT::Err: Debug,{match self {Self::Uninited => None,Self::Once { words } => words.next(),Self::Lines { rdr, words } => words.next().or_else(|| {let mut line = "".to_owned();rdr.read_line(&mut line).unwrap();*words = Box::leak(line.into_boxed_str()).split_whitespace();words.next()}),}.expect("reached EOF").parse().unwrap()}}thread_local! {pub static DEFAULT_SCANNER: Rc<RefCell<Scanner>> = Rc::new(RefCell::new(Scanner::Uninited));}pub trait Readable {type Output;fn read_from_scanner(scanner: &mut Scanner) -> Self::Output;}impl<T: FromStr> Readable for TwhereT::Err: Debug,{type Output = Self;fn read_from_scanner(scanner: &mut Scanner) -> Self {scanner.parse_next_unwrap()}}pub enum Usize1 {}pub enum Chars {}impl Readable for Usize1 {type Output = usize;fn read_from_scanner(scanner: &mut Scanner) -> Self::Output {let val: usize = scanner.parse_next_unwrap();if val == 0 {panic!("Usize1-0-parse-error");}val - 1}}impl Readable for Chars {type Output = Vec<char>;fn read_from_scanner(scanner: &mut Scanner) -> Self::Output {let val: String = scanner.parse_next_unwrap();val.chars().collect()}}}