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 |
|
|
| 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 |