Submission #56347912


Source Code Expand

#![allow(dead_code, unused_macros, unused_imports)]
use std::{cell::{Cell, RefCell, UnsafeCell}, cmp::{max, min, Ordering, Reverse}, collections::{hash_map::{DefaultHasher, RandomState}, BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, VecDeque}, convert::{Infallible, TryFrom, TryInto}, error::Error, fmt::{Debug, Display, Write as FmtWrite}, hash::{BuildHasher, Hash, Hasher}, io::{BufWriter, Read, Stdin, Stdout, Write}, iter::{FromIterator, Peekable}, marker::PhantomData, mem::swap, ops::*, process::exit, rc::Rc, str::{from_utf8_unchecked, FromStr}, time::{Duration, Instant}};

const IO_BUF_SIZE: usize = 1 << 16;
type Input = Scanner<Stdin>;
type Output = BufWriter<Stdout>;
fn _init_input() -> Input { Scanner::new(std::io::stdin()) }
fn _init_output() -> Output { BufWriter::with_capacity(IO_BUF_SIZE, std::io::stdout()) }

#[repr(transparent)] struct Unsync<T>(T);
unsafe impl<T> Sync for Unsync<T> {}
 
type BadLazy<T> = Unsync<UnsafeCell<Option<T>>>;
impl<T> BadLazy<T> {
    const fn new() -> Self { Self(UnsafeCell::new(None)) }
}
 
static INPUT: BadLazy<Input> = BadLazy::new();
static OUTPUT: BadLazy<Output> = BadLazy::new();
 
fn inp<F: FnOnce(&mut Input) -> R, R>(f: F) -> R {
    unsafe { f((&mut *INPUT.0.get()).get_or_insert_with(_init_input)) }
}
fn out<F: FnOnce(&mut Output) -> R, R>(f: F) -> R {
    unsafe { f((&mut *OUTPUT.0.get()).get_or_insert_with(_init_output)) }
}

macro_rules! read {
    () => { read() };
    ($t: ty) => { read::<$t>() };
    ($t: ty, $($tt: ty),*) => { (read::<$t>(), $(read::<$tt>(),)*) };
    [$t: ty; $n: expr] => { read_vec::<$t>($n) };
}
macro_rules! println { 
    () => { out(|x| { let _ = writeln!(x); }) };
    ($($arg : tt )*) => { out(|x| { let _ = writeln!(x, $($arg)*); }) }
}
macro_rules! print { 
    ($($arg : tt )*) => { out(|x| { let _ = write!(x, $($arg)*); }) }
}
fn println(arg: impl Display) { println!("{}", arg); }
fn print(arg: impl Display) { print!("{}", arg); }

fn out_flush() { out(|x| { let _ = x.flush(); }); }

fn input_is_eof() -> bool { inp(|x| x.eof()) }
fn read_byte() -> u8 { inp(|x| x.byte()) }
fn read_bytes_no_skip(n: usize) -> Vec<u8> { inp(|x| x.bytes_no_skip(n)) }
fn read_bytes(n: usize) -> Vec<u8> { inp(|x| x.bytes(n)) }
fn read_bytes2(n: usize, m: usize) -> Vec<Vec<u8>> { inp(|x| x.bytes2(n, m)) }
fn read_token() -> Vec<u8> { inp(|x| x.token_bytes()) }
fn read_token_str() -> String { unsafe { String::from_utf8_unchecked(read_token()) } }
fn read_line() -> Vec<u8> { inp(|x| x.line_bytes()) }
fn read_line_str() -> String { unsafe { String::from_utf8_unchecked(read_line()) } }
fn read<T: FromStr>() -> T { read_token_str().parse::<T>().ok().expect("failed parse") }
fn read_vec<T: FromStr>(n: usize) -> Vec<T> { (0..n).map(|_| read()).collect() }
fn read_vec2<T: FromStr>(n: usize, m: usize) -> Vec<Vec<T>> { (0..n).map(|_| read_vec(m)).collect() }

struct Scanner<R: Read> {
    src: R,
    _buf: Vec<u8>,
    _pt: usize, // pointer
    _rd: usize, // bytes read
}

#[allow(dead_code)]
impl<R: Read> Scanner<R> {
    fn new(src: R) -> Scanner<R> {
        Scanner { src, _buf: vec![0; IO_BUF_SIZE], _pt: 1, _rd: 1 }
    }
 
    fn _check_buf(&mut self) {
        if self._pt == self._rd {
            self._rd = self.src.read(&mut self._buf).unwrap_or(0);
            self._pt = (self._rd == 0) as usize;
        }
    }
 
    // returns true if end of file
    fn eof(&mut self) -> bool {
        self._check_buf();
        self._rd == 0
    }
 
    // filters \r, returns \0 if eof
    fn byte(&mut self) -> u8 {
        loop {
            self._check_buf();
            if self._rd == 0 { return 0; }
            let res = self._buf[self._pt];
            self._pt += 1;
            if res != b'\r' { return res; }
        }
    }

    fn bytes_no_skip(&mut self, n: usize) -> Vec<u8> { (0..n).map(|_| self.byte()).collect() }
    fn bytes(&mut self, n: usize) -> Vec<u8> {
        let res = self.bytes_no_skip(n);
        self.byte();
        res
    }
    fn bytes2(&mut self, n: usize, m: usize) -> Vec<Vec<u8>> { (0..n).map(|_| self.bytes(m)).collect() }
 
    fn token_bytes(&mut self) -> Vec<u8> {
        let mut res = Vec::new();
        let mut c = self.byte();
        while c <= b' ' {
            if c == b'\0' { return res; }
            c = self.byte();
        }
        loop {
            res.push(c);
            c = self.byte();
            if c <= b' ' { return res; }
        }
    }
 
    fn line_bytes(&mut self) -> Vec<u8> {
        let mut res = Vec::new();
        let mut c = self.byte();
        while c != b'\n' && c != b'\0' {
            res.push(c);
            c = self.byte();
        }
        res
    }
}

trait JoinToStr { 
    fn join_to_str(self, sep: &str) -> String;
    fn concat_to_str(self) -> String;
}
impl<T: Display, I: Iterator<Item = T>> JoinToStr for I { 
    fn join_to_str(mut self, sep: &str) -> String {
        match self.next() {
            Some(first) => {
                let mut res = first.to_string();
                while let Some(item) = self.next() {
                    res.push_str(sep);
                    res.push_str(&item.to_string());
                }
                res
            }
            None => { String::new() }
        }
    }
 
    fn concat_to_str(self) -> String {
        let mut res = String::new();
        for item in self { res.push_str(&item.to_string()); }
        res
    }
}
trait AsStr { fn as_str(&self) -> &str; }
impl AsStr for [u8] { fn as_str(&self) -> &str {std::str::from_utf8(self).expect("attempt to convert non-UTF8 byte string.")} }

macro_rules! veci {
    ($n:expr , $i:ident : $gen:expr) => {{
        let _veci_n = $n;
        let mut _veci_list = Vec::with_capacity(_veci_n);
        for $i in 0.._veci_n {
            _veci_list.push($gen);
        }
        _veci_list
    }};
    ($n:expr , $gen:expr) => { veci!($n, _veci_: $gen) }
}

fn abs_diff<T: Sub<Output = T> + PartialOrd>(x: T, y: T) -> T {
    if x < y { y - x } else { x - y }
}

trait CommonNumExt {
    fn div_ceil(self, b: Self) -> Self;
    fn div_floor(self, b: Self) -> Self;
    fn gcd(self, b: Self) -> Self;
    fn highest_one(self) -> Self;
    fn lowest_one(self) -> Self;
    fn sig_bits(self) -> u32;
}

macro_rules! impl_common_num_ext {
    ($($ix:tt = $ux:tt),*) => {
        $(
            impl CommonNumExt for $ux {
                fn div_ceil(self, b: Self) -> Self {
                    let q = self / b; let r = self % b;
                    if r != 0 { q + 1 } else { q }
                }
                fn div_floor(self, b: Self) -> Self { self / b }
                fn gcd(self, mut b: Self) -> Self {
                    let mut a = self;
                    if a == 0 || b == 0 { return a | b; }
                    let shift = (a | b).trailing_zeros();
                    a >>= a.trailing_zeros();
                    b >>= b.trailing_zeros();
                    while a != b {
                        if a > b { a -= b; a >>= a.trailing_zeros(); }
                        else { b -= a; b >>= b.trailing_zeros(); }
                    }
                    a << shift
                }
                #[inline] fn highest_one(self) -> Self { 
                    if self == 0 { 0 } else { const ONE: $ux = 1; ONE << self.sig_bits() - 1 } 
                }
                #[inline] fn lowest_one(self) -> Self { self & self.wrapping_neg() }
                #[inline] fn sig_bits(self) -> u32 { std::mem::size_of::<$ux>() as u32 * 8 - self.leading_zeros() }
            }

            impl CommonNumExt for $ix {
                fn div_ceil(self, b: Self) -> Self {
                    let q = self / b; let r = self % b;
                    if self ^ b >= 0 && r != 0 { q + 1 } else { q }
                }
                fn div_floor(self, b: Self) -> Self { 
                    let q = self / b; let r = self % b;
                    if self ^ b < 0 && r != 0 { q - 1 } else { q }
                }
                fn gcd(self, b: Self) -> Self {
                    fn w_abs(x: $ix) -> $ux { (if x.is_negative() { x.wrapping_neg() } else { x }) as _ }
                    w_abs(self).gcd(w_abs(b)) as _
                }
                #[inline] fn highest_one(self) -> Self { (self as $ux).highest_one() as _ }
                #[inline] fn lowest_one(self) -> Self { self & self.wrapping_neg() }
                #[inline] fn sig_bits(self) -> u32 { std::mem::size_of::<$ix>() as u32 * 8 - self.leading_zeros() }
            }
        )*
    }
}
impl_common_num_ext!(i8 = u8, i16 = u16, i32 = u32, i64 = u64, i128 = u128, isize = usize);

trait ChMaxMin<T> {
    fn chmax(&mut self, v: T) -> bool;
    fn chmin(&mut self, v: T) -> bool;
}
impl<T: PartialOrd> ChMaxMin<T> for Option<T> {
    fn chmax(&mut self, v: T) -> bool { if self.is_none() || v > *self.as_ref().unwrap() { *self = Some(v); true } else { false } }
    fn chmin(&mut self, v: T) -> bool { if self.is_none() || v < *self.as_ref().unwrap() { *self = Some(v); true } else { false } }
}
impl<T: PartialOrd> ChMaxMin<T> for T {
    fn chmax(&mut self, v: T) -> bool { if v > *self { *self = v; true } else { false } }
    fn chmin(&mut self, v: T) -> bool { if v < *self { *self = v; true } else { false } }
}

// * end commons * //

trait SqrtExt {
    fn sqrt_floor(self) -> Self;
    fn sqrt_ceil(self) -> Self;
    fn sqrt_round(self) -> Self;
}

macro_rules! impl_sqrt_ext_for_64 {
    ($($ty:tt),*) => {
        $(
            impl SqrtExt for $ty {
                fn sqrt_floor(self) -> Self {
                    let g = (self as f64).sqrt() as $ty;
                    if self < g * g { g - 1 } else { g }
                }

                fn sqrt_ceil(self) -> Self {
                    let g = (self as f64).sqrt() as $ty;
                    if self > g * g { g + 1 } else { g }
                }

                fn sqrt_round(self) -> Self {
                    let g = self.sqrt_floor();
                    if g * g < self - g { g + 1 } else { g }
                }
            }
        )*
    }
}
impl_sqrt_ext_for_64!(u64, i64, usize, isize);

#[allow(non_snake_case, non_upper_case_globals)]
fn main() {
    let num_cases: usize = 1;//read();
	
    for _case_num in 1..=num_cases {
        let n = read!(usize);
        let m = read!(usize);

        let T = veci!{m, (read!(i32), read!(usize)-1)};

        let mut G = vec![vec![]; n];
        for i in 0..m {
            let (t, p) = T[i];
            G[p].push(t);
        }

        let th = m.sqrt_ceil();
        let mut pre = vec![vec![]; n];
        for u in 0..n {
            if G[u].len() < th { continue; }

            let mut res = vec![0; n];
            let mut ps = vec![0; m];
            let mut tin = vec![!0; n];
            for j in 0..m {
                let (t, p) = T[j];
                if j > 0 {
                    ps[j] = ps[j-1];
                    if tin[u] != !0 {
                        ps[j] += t - T[j-1].0;
                    }
                }
                if tin[p] == !0 {
                    tin[p] = j;
                } else {
                    res[p] += ps[j] - ps[tin[p]];
                    tin[p] = !0;
                }
            }
            pre[u] = res;
        }

        let q = read!(usize);
        for _ in 0..q {
            let mut u = read!(usize)-1;
            let mut v = read!(usize)-1;

            if pre[u].is_empty() { swap(&mut u, &mut v); }
            if !pre[u].is_empty() {
                println(pre[u][v]);
            } else {
                let mut A = &G[u][..];
                let mut B = &G[v][..];

                let mut ans = 0;
                while !A.is_empty() && !B.is_empty() {
                    if A[1] > B[1] { swap(&mut A, &mut B); }
                    if A[1] > B[0] {
                        ans += A[1] - max(A[0], B[0]);
                    }
                    A = &A[2..];
                }
                println(ans);
            }
        }
    }
 
    out_flush();
}

Submission Info

Submission Time
Task G - AtCoder Office
User spheniscine
Language Rust (rustc 1.70.0)
Score 575
Code Size 12306 Byte
Status AC
Exec Time 639 ms
Memory 88256 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 575 / 575
Status
AC × 2
AC × 78
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt, 01_random_13.txt, 01_random_14.txt, 01_random_15.txt, 01_random_16.txt, 01_random_17.txt, 01_random_18.txt, 01_random_19.txt, 01_random_20.txt, 01_random_21.txt, 01_random_22.txt, 01_random_23.txt, 01_random_24.txt, 01_random_25.txt, 01_random_26.txt, 01_random_27.txt, 01_random_28.txt, 01_random_29.txt, 01_random_30.txt, 01_random_31.txt, 01_random_32.txt, 01_random_33.txt, 01_random_34.txt, 01_random_35.txt, 01_random_36.txt, 01_random_37.txt, 01_random_38.txt, 01_random_39.txt, 01_random_40.txt, 01_random_41.txt, 01_random_42.txt, 01_random_43.txt, 01_random_44.txt, 01_random_45.txt, 01_random_46.txt, 01_random_47.txt, 01_random_48.txt, 01_random_49.txt, 01_random_50.txt, 01_random_51.txt, 01_random_52.txt, 01_random_53.txt, 01_random_54.txt, 01_random_55.txt, 01_random_56.txt, 01_random_57.txt, 01_random_58.txt, 01_random_59.txt, 01_random_60.txt, 01_random_61.txt, 01_random_62.txt, 01_random_63.txt, 01_random_64.txt, 01_random_65.txt, 01_random_66.txt, 01_random_67.txt, 01_random_68.txt, 01_random_69.txt, 02_handmade_68.txt, 02_handmade_69.txt, 02_handmade_70.txt, 02_handmade_71.txt, 02_handmade_72.txt, 02_handmade_73.txt, 02_handmade_74.txt, 02_handmade_75.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 2060 KiB
00_sample_01.txt AC 1 ms 2000 KiB
01_random_02.txt AC 64 ms 16632 KiB
01_random_03.txt AC 70 ms 16592 KiB
01_random_04.txt AC 65 ms 16660 KiB
01_random_05.txt AC 64 ms 16604 KiB
01_random_06.txt AC 64 ms 16616 KiB
01_random_07.txt AC 66 ms 16580 KiB
01_random_08.txt AC 65 ms 16584 KiB
01_random_09.txt AC 65 ms 16620 KiB
01_random_10.txt AC 67 ms 16616 KiB
01_random_11.txt AC 66 ms 16564 KiB
01_random_12.txt AC 64 ms 16592 KiB
01_random_13.txt AC 66 ms 16572 KiB
01_random_14.txt AC 246 ms 7044 KiB
01_random_15.txt AC 16 ms 8168 KiB
01_random_16.txt AC 32 ms 7376 KiB
01_random_17.txt AC 34 ms 5764 KiB
01_random_18.txt AC 39 ms 14816 KiB
01_random_19.txt AC 33 ms 7676 KiB
01_random_20.txt AC 37 ms 8688 KiB
01_random_21.txt AC 33 ms 7080 KiB
01_random_22.txt AC 32 ms 6984 KiB
01_random_23.txt AC 43 ms 7388 KiB
01_random_24.txt AC 89 ms 7304 KiB
01_random_25.txt AC 254 ms 7512 KiB
01_random_26.txt AC 250 ms 7536 KiB
01_random_27.txt AC 332 ms 7800 KiB
01_random_28.txt AC 258 ms 7872 KiB
01_random_29.txt AC 267 ms 7960 KiB
01_random_30.txt AC 77 ms 6956 KiB
01_random_31.txt AC 58 ms 8076 KiB
01_random_32.txt AC 62 ms 14492 KiB
01_random_33.txt AC 31 ms 7068 KiB
01_random_34.txt AC 31 ms 7012 KiB
01_random_35.txt AC 32 ms 7016 KiB
01_random_36.txt AC 43 ms 7360 KiB
01_random_37.txt AC 43 ms 7180 KiB
01_random_38.txt AC 89 ms 7348 KiB
01_random_39.txt AC 88 ms 7316 KiB
01_random_40.txt AC 216 ms 7564 KiB
01_random_41.txt AC 217 ms 7568 KiB
01_random_42.txt AC 259 ms 7776 KiB
01_random_43.txt AC 298 ms 7948 KiB
01_random_44.txt AC 303 ms 7960 KiB
01_random_45.txt AC 126 ms 7084 KiB
01_random_46.txt AC 74 ms 8524 KiB
01_random_47.txt AC 74 ms 16792 KiB
01_random_48.txt AC 45 ms 9920 KiB
01_random_49.txt AC 51 ms 10784 KiB
01_random_50.txt AC 59 ms 13392 KiB
01_random_51.txt AC 59 ms 13316 KiB
01_random_52.txt AC 61 ms 13376 KiB
01_random_53.txt AC 58 ms 13316 KiB
01_random_54.txt AC 40 ms 9980 KiB
01_random_55.txt AC 43 ms 10148 KiB
01_random_56.txt AC 488 ms 69088 KiB
01_random_57.txt AC 639 ms 88256 KiB
01_random_58.txt AC 571 ms 9048 KiB
01_random_59.txt AC 493 ms 9272 KiB
01_random_60.txt AC 476 ms 9300 KiB
01_random_61.txt AC 39 ms 9948 KiB
01_random_62.txt AC 41 ms 10120 KiB
01_random_63.txt AC 223 ms 68908 KiB
01_random_64.txt AC 274 ms 88060 KiB
01_random_65.txt AC 142 ms 8988 KiB
01_random_66.txt AC 130 ms 9068 KiB
01_random_67.txt AC 125 ms 9212 KiB
01_random_68.txt AC 42 ms 17616 KiB
01_random_69.txt AC 44 ms 17464 KiB
02_handmade_68.txt AC 44 ms 17628 KiB
02_handmade_69.txt AC 43 ms 17556 KiB
02_handmade_70.txt AC 68 ms 20048 KiB
02_handmade_71.txt AC 62 ms 19608 KiB
02_handmade_72.txt AC 62 ms 18868 KiB
02_handmade_73.txt AC 66 ms 20028 KiB
02_handmade_74.txt AC 66 ms 19588 KiB
02_handmade_75.txt AC 62 ms 18820 KiB