QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#795456 | #9809. The Grand Contest | ucup-team296# | AC ✓ | 229ms | 50748kb | Rust | 59.5kb | 2024-11-30 20:38:56 | 2024-11-30 20:38:57 |
Judging History
answer
// https://contest.ucup.ac/contest/1865/problem/9809
pub mod solution {
//{"name":"L. The Grand Contest","group":"Universal Cup - The 3rd Universal Cup. Stage 19: Shenyang","url":"https://contest.ucup.ac/contest/1865/problem/9809","interactive":false,"timeLimit":1000,"tests":[{"input":"2\n6 20\n1 1 60 0\n2 2 60 0\n2 2 120 1\n1 2 180 1\n1 2 180 0\n2 2 300 1\n2 20\n1 1 300 1\n2 2 300 1\n","output":"120 160\n-1\n"}],"testType":"single","input":{"type":"stdin","fileName":null,"pattern":null},"output":{"type":"stdout","fileName":null,"pattern":null},"languages":{"java":{"taskClass":"LTheGrandContest"}}}
use crate::algo_lib::collections::default_map::default_hash_map::DefaultHashMap;
use crate::algo_lib::collections::fx_hash_map::FxHashSet;
use crate::algo_lib::collections::iter_ext::iter_copied::ItersCopied;
use crate::algo_lib::collections::min_max::MinimMaxim;
use crate::algo_lib::collections::segment_tree::SegmentTree;
use crate::algo_lib::collections::segment_tree::SegmentTreeNode;
use crate::algo_lib::collections::slice_ext::backward::Back;
use crate::algo_lib::collections::slice_ext::bounds::Bounds;
use crate::algo_lib::collections::slice_ext::compress::compress;
use crate::algo_lib::collections::slice_ext::compress::Compressed;
use crate::algo_lib::collections::slice_ext::indices::Indices;
use crate::algo_lib::io::input::Input;
use crate::algo_lib::io::output::Output;
use crate::algo_lib::misc::direction::Direction;
use crate::algo_lib::misc::test_type::TaskType;
use crate::algo_lib::misc::test_type::TestType;
use crate::algo_lib::numbers::num_utils::PartialSums;
use crate::algo_lib::numbers::num_utils::UpperDiv;
type PreCalc = ();
fn solve(input: &mut Input, out: &mut Output, _test_case: usize, _data: &mut PreCalc) {
let n = input.read_size();
let p = input.read_long();
let submissions = input.read_vec::<(usize, usize, i64, usize)>(n);
let mut score = [0; 2];
let mut penalty = [0; 2];
let mut solve_at = vec![Vec::new(); 2];
let mut solved = vec![FxHashSet::default(); 2];
let mut submits = vec![DefaultHashMap::<_, i64>::new(); 2];
for (team, problem, time, verdict) in submissions.copy_iter() {
let team = team - 1;
if solved[team].contains(&problem) {
continue;
}
if verdict == 1 {
penalty[team] += time + submits[team][problem] * p;
score[team] += 1;
solved[team].insert(problem);
solve_at[team].push(time);
} else {
submits[team][problem] += 1;
}
}
if score[0] != score[1] || score[0] == 0 {
out.print_line(-1);
return;
}
let need = if penalty[0] <= penalty[1] {
penalty[1] - penalty[0] + 1
} else {
solve_at.swap(0, 1);
penalty[0] - penalty[1]
};
let s0 = solve_at[0].clone();
let s1 = solve_at[1].clone();
let Compressed {
order: poi,
arrs: [s0, s1],
} = compress([&s0, &s1]);
let mut len = vec![0; poi.len()];
for i in poi.indices() {
len[i] = poi[i] - if i > 0 { poi[i - 1] } else { 0 };
}
let mut delta = vec![0; poi.len()];
for (mult, s) in [(-1, s0), (1, s1)] {
let mut cur = 0;
let mut x = score[0];
for i in s {
for i in cur..=i {
delta[i] += mult * x;
}
x -= 1;
cur = i + 1;
}
}
let mut ans = None;
let total = poi[Back(0)];
for reversed in [false, true] {
#[derive(Default, Clone)]
struct Node {
sum: i64,
max: i64,
}
impl SegmentTreeNode for Node {
fn new(_left: usize, _right: usize) -> Self {
Self::default()
}
fn join(&mut self, left_val: &Self, right_val: &Self) {
self.sum = left_val.sum + right_val.sum;
self.max = left_val.max.max(left_val.sum + right_val.max);
}
fn accumulate(&mut self, _value: &Self) {}
fn reset_delta(&mut self) {}
}
let mut st = SegmentTree::<Node>::new(poi.len());
let s = len.partial_sums();
for i in poi.indices().rev() {
st.point_update(
i,
Node {
sum: delta[i] * len[i],
max: (delta[i] * len[i]).max(0),
},
);
if st.query(..).max < need {
continue;
}
let mut need_rem = need;
let pos = st.binary_search(
|left, _right| {
if left.max >= need_rem {
Direction::Left
} else {
need_rem -= left.sum;
Direction::Right
}
},
|_, pos| pos,
);
assert!(delta[pos] > 0);
let end = s[pos] + need_rem.upper_div(delta[pos]);
let cur_len = end - s[i];
let (start, end) = if reversed {
(total - end, total - s[i])
} else {
(s[i], end)
};
ans.minim((cur_len, start, end));
}
len.reverse();
delta.reverse();
}
if ans.is_none() {
out.print_line(-1);
return;
}
let (_, mut l, mut r) = ans.unwrap();
let p0 = poi.lower_bound(&l);
let p1 = poi.lower_bound(&r);
if p0 != p1 {
let p0_prev = if p0 > 0 { poi[p0 - 1] } else { 0 };
let p1_prev = if p1 > 0 { poi[p1 - 1] } else { 0 };
let mut total = 0;
for i in p0 + 1..p1 {
total += delta[i] * len[i];
}
total += (poi[p0] - l) * delta[p0] + (r - p1_prev) * delta[p1];
let max = (poi[p0] - p0_prev).min(poi[p1] - p1_prev);
let cur = delta[p1] - delta[p0];
assert!(cur > 0);
let shift = ((total - need) / cur).min(max);
l -= shift;
r -= shift;
}
out.print_line((l, r));
}
pub static TEST_TYPE: TestType = TestType::MultiNumber;
pub static TASK_TYPE: TaskType = TaskType::Classic;
pub(crate) fn run(mut input: Input, mut output: Output) -> bool {
let mut pre_calc = ();
match TEST_TYPE {
TestType::Single => solve(&mut input, &mut output, 1, &mut pre_calc),
TestType::MultiNumber => {
let t = input.read();
for i in 1..=t {
solve(&mut input, &mut output, i, &mut pre_calc);
}
}
TestType::MultiEof => {
let mut i = 1;
while input.peek().is_some() {
solve(&mut input, &mut output, i, &mut pre_calc);
i += 1;
}
}
}
output.flush();
match TASK_TYPE {
TaskType::Classic => input.is_empty(),
TaskType::Interactive => true,
}
}
}
pub mod algo_lib {
#![allow(clippy::too_many_arguments)]
#![allow(clippy::type_complexity)]
#![allow(clippy::missing_safety_doc)]
#![allow(clippy::legacy_numeric_constants)]
pub mod collections {
pub mod bounds {
use std::ops::RangeBounds;
pub fn clamp(range: impl RangeBounds<usize>, n: usize) -> (usize, usize) {
let start = match range.start_bound() {
std::ops::Bound::Included(&x) => x,
std::ops::Bound::Excluded(&x) => x + 1,
std::ops::Bound::Unbounded => 0,
};
let end = match range.end_bound() {
std::ops::Bound::Included(&x) => x + 1,
std::ops::Bound::Excluded(&x) => x,
std::ops::Bound::Unbounded => n,
};
(start, end.min(n))
}
}
pub mod default_map {
pub mod default_hash_map {
use crate::algo_lib::collections::fx_hash_map::FxHashMap;
use std::hash::Hash;
use std::iter::FromIterator;
use std::ops::Deref;
use std::ops::DerefMut;
use std::ops::Index;
use std::ops::IndexMut;
#[derive(Default, Clone, Eq, PartialEq, Debug)]
pub struct DefaultHashMap<K: Hash + Eq, V>(FxHashMap<K, V>, V);
impl<K: Hash + Eq, V> Deref for DefaultHashMap<K, V> {
type Target = FxHashMap<K, V>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<K: Hash + Eq, V> DerefMut for DefaultHashMap<K, V> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
impl<K: Hash + Eq, V: Default> DefaultHashMap<K, V> {
pub fn new() -> Self {
Self(FxHashMap::default(), V::default())
}
pub fn get(&self, key: &K) -> &V {
self.0.get(key).unwrap_or(&self.1)
}
pub fn get_mut(&mut self, key: K) -> &mut V {
self.0.entry(key).or_insert_with(|| V::default())
}
pub fn into_values(self) -> std::collections::hash_map::IntoValues<K, V> {
self.0.into_values()
}
}
impl<K: Hash + Eq, V: Default> Index<K> for DefaultHashMap<K, V> {
type Output = V;
fn index(&self, index: K) -> &Self::Output {
self.get(&index)
}
}
impl<K: Hash + Eq, V: Default> IndexMut<K> for DefaultHashMap<K, V> {
fn index_mut(&mut self, index: K) -> &mut Self::Output {
self.get_mut(index)
}
}
impl<K: Hash + Eq, V> IntoIterator for DefaultHashMap<K, V> {
type Item = (K, V);
type IntoIter = std::collections::hash_map::IntoIter<K, V>;
fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}
impl<K: Hash + Eq, V: Default> FromIterator<(K, V)> for DefaultHashMap<K, V> {
fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
Self(iter.into_iter().collect(), V::default())
}
}
}
}
pub mod fx_hash_map {
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use std::cell::Cell;
use std::convert::TryInto;
use std::time::SystemTime;
use std::collections::HashMap;
use std::collections::HashSet;
use std::hash::BuildHasherDefault;
use std::hash::Hasher;
use std::mem::size_of;
use std::ops::BitXor;
pub type FxHashMap<K, V> = HashMap<K, V, BuildHasherDefault<FxHasher>>;
pub type FxHashSet<V> = HashSet<V, BuildHasherDefault<FxHasher>>;
#[derive(Default)]
pub struct FxHasher {
hash: usize,
}
thread_local! {
static K: Cell<usize> = Cell::new(
((SystemTime::UNIX_EPOCH.elapsed().unwrap().as_nanos().wrapping_mul(2) + 1) & 0xFFFFFFFFFFFFFFFF) as usize
);
}
impl FxHasher {
#[inline]
fn add_to_hash(&mut self, i: usize) {
self.hash = self
.hash
.rotate_left(5)
.bitxor(i)
.wrapping_mul(K.with(|k| k.get()));
}
}
impl Hasher for FxHasher {
#[inline]
fn write(&mut self, mut bytes: &[u8]) {
let read_usize = |bytes: &[u8]| u64::from_ne_bytes(bytes[..8].try_into().unwrap());
let mut hash = FxHasher { hash: self.hash };
while bytes.len() >= size_of::<usize>() {
hash.add_to_hash(read_usize(bytes) as usize);
bytes = &bytes[size_of::<usize>()..];
}
if (size_of::<usize>() > 4) && (bytes.len() >= 4) {
hash.add_to_hash(u32::from_ne_bytes(bytes[..4].try_into().unwrap()) as usize);
bytes = &bytes[4..];
}
if (size_of::<usize>() > 2) && bytes.len() >= 2 {
hash.add_to_hash(u16::from_ne_bytes(bytes[..2].try_into().unwrap()) as usize);
bytes = &bytes[2..];
}
if (size_of::<usize>() > 1) && !bytes.is_empty() {
hash.add_to_hash(bytes[0] as usize);
}
self.hash = hash.hash;
}
#[inline]
fn write_u8(&mut self, i: u8) {
self.add_to_hash(i as usize);
}
#[inline]
fn write_u16(&mut self, i: u16) {
self.add_to_hash(i as usize);
}
#[inline]
fn write_u32(&mut self, i: u32) {
self.add_to_hash(i as usize);
}
#[inline]
fn write_u64(&mut self, i: u64) {
self.add_to_hash(i as usize);
}
#[inline]
fn write_usize(&mut self, i: usize) {
self.add_to_hash(i);
}
#[inline]
fn finish(&self) -> u64 {
self.hash as u64
}
}
}
pub mod iter_ext {
pub mod iter_copied {
use std::iter::Chain;
use std::iter::Copied;
use std::iter::Enumerate;
use std::iter::Filter;
use std::iter::Map;
use std::iter::Rev;
use std::iter::Skip;
use std::iter::StepBy;
use std::iter::Sum;
use std::iter::Take;
use std::iter::Zip;
pub trait ItersCopied<'a, T: 'a + Copy>: Sized + 'a
where
&'a Self: IntoIterator<Item = &'a T>,
{
fn copy_iter(&'a self) -> Copied<<&'a Self as IntoIterator>::IntoIter> {
self.into_iter().copied()
}
fn copy_enumerate(&'a self) -> Enumerate<Copied<<&'a Self as IntoIterator>::IntoIter>> {
self.copy_iter().enumerate()
}
fn copy_rev(&'a self) -> Rev<Copied<<&'a Self as IntoIterator>::IntoIter>>
where
Copied<<&'a Self as IntoIterator>::IntoIter>: DoubleEndedIterator,
{
self.copy_iter().rev()
}
fn copy_skip(&'a self, n: usize) -> Skip<Copied<<&'a Self as IntoIterator>::IntoIter>> {
self.copy_iter().skip(n)
}
fn copy_take(&'a self, n: usize) -> Take<Copied<<&'a Self as IntoIterator>::IntoIter>> {
self.copy_iter().take(n)
}
fn copy_chain<V>(
&'a self,
chained: &'a V,
) -> Chain<
Copied<<&'a Self as IntoIterator>::IntoIter>,
Copied<<&'a V as IntoIterator>::IntoIter>,
>
where
&'a V: IntoIterator<Item = &'a T>,
{
self.copy_iter().chain(chained.into_iter().copied())
}
fn copy_zip<V>(
&'a self,
other: &'a V,
) -> Zip<Copied<<&'a Self as IntoIterator>::IntoIter>, Copied<<&'a V as IntoIterator>::IntoIter>>
where
&'a V: IntoIterator<Item = &'a T>,
{
self.copy_iter().zip(other.into_iter().copied())
}
fn copy_max(&'a self) -> T
where
T: Ord,
{
self.copy_iter().max().unwrap()
}
fn copy_max_by_key<B, F>(&'a self, f: F) -> T
where
F: FnMut(&T) -> B,
B: Ord,
{
self.copy_iter().max_by_key(f).unwrap()
}
fn copy_min(&'a self) -> T
where
T: Ord,
{
self.copy_iter().min().unwrap()
}
fn copy_min_by_key<B, F>(&'a self, f: F) -> T
where
F: FnMut(&T) -> B,
B: Ord,
{
self.copy_iter().min_by_key(f).unwrap()
}
fn copy_sum(&'a self) -> T
where
T: Sum<T>,
{
self.copy_iter().sum()
}
fn copy_map<F, U>(&'a self, f: F) -> Map<Copied<<&'a Self as IntoIterator>::IntoIter>, F>
where
F: FnMut(T) -> U,
{
self.copy_iter().map(f)
}
fn copy_all(&'a self, f: impl FnMut(T) -> bool) -> bool {
self.copy_iter().all(f)
}
fn copy_any(&'a self, f: impl FnMut(T) -> bool) -> bool {
self.copy_iter().any(f)
}
fn copy_step_by(&'a self, step: usize) -> StepBy<Copied<<&'a Self as IntoIterator>::IntoIter>> {
self.copy_iter().step_by(step)
}
fn copy_filter<F: FnMut(&T) -> bool>(
&'a self,
f: F,
) -> Filter<Copied<<&'a Self as IntoIterator>::IntoIter>, F> {
self.copy_iter().filter(f)
}
fn copy_fold<Acc, F>(&'a self, init: Acc, f: F) -> Acc
where
F: FnMut(Acc, T) -> Acc,
{
self.copy_iter().fold(init, f)
}
fn copy_reduce<F>(&'a self, f: F) -> Option<T>
where
F: FnMut(T, T) -> T,
{
self.copy_iter().reduce(f)
}
fn copy_position<P>(&'a self, predicate: P) -> Option<usize>
where
P: FnMut(T) -> bool,
{
self.copy_iter().position(predicate)
}
}
impl<'a, U: 'a, T: 'a + Copy> ItersCopied<'a, T> for U where &'a U: IntoIterator<Item = &'a T> {}
}
}
pub mod min_max {
pub trait MinimMaxim<Rhs = Self>: PartialOrd + Sized {
fn minim(&mut self, other: Rhs) -> bool;
fn maxim(&mut self, other: Rhs) -> bool;
}
impl<T: PartialOrd> MinimMaxim for T {
fn minim(&mut self, other: Self) -> bool {
if other < *self {
*self = other;
true
} else {
false
}
}
fn maxim(&mut self, other: Self) -> bool {
if other > *self {
*self = other;
true
} else {
false
}
}
}
impl<T: PartialOrd> MinimMaxim<T> for Option<T> {
fn minim(&mut self, other: T) -> bool {
match self {
None => {
*self = Some(other);
true
}
Some(v) => v.minim(other),
}
}
fn maxim(&mut self, other: T) -> bool {
match self {
None => {
*self = Some(other);
true
}
Some(v) => v.maxim(other),
}
}
}
}
pub mod segment_tree {
use crate::algo_lib::collections::bounds::clamp;
use crate::algo_lib::misc::direction::Direction;
use crate::algo_lib::numbers::num_traits::algebra::One;
use crate::algo_lib::numbers::num_traits::algebra::Zero;
use crate::when;
use std::marker::PhantomData;
use std::ops::Add;
use std::ops::MulAssign;
use std::ops::RangeBounds;
pub trait SegmentTreeNode {
fn new(left: usize, right: usize) -> Self;
fn join(&mut self, left_val: &Self, right_val: &Self);
fn accumulate(&mut self, value: &Self);
fn reset_delta(&mut self);
}
pub trait Pushable<T>: SegmentTreeNode {
fn push(&mut self, delta: T);
}
impl<T: SegmentTreeNode> Pushable<&T> for T {
fn push(&mut self, delta: &T) {
self.accumulate(delta);
}
}
impl<T: SegmentTreeNode> Pushable<T> for T {
fn push(&mut self, delta: T) {
*self = delta;
}
}
pub trait QueryResult<Result, Args>: SegmentTreeNode {
fn empty_result(args: &Args) -> Result;
fn result(&self, args: &Args) -> Result;
fn join_results(
left_res: Result,
right_res: Result,
args: &Args,
left: usize,
mid: usize,
right: usize,
) -> Result;
}
impl<T: SegmentTreeNode + Clone> QueryResult<T, ()> for T {
fn empty_result(_: &()) -> T {
Self::new(0, 0)
}
fn result(&self, _: &()) -> T {
self.clone()
}
fn join_results(left_res: T, right_res: T, _: &(), left: usize, mid: usize, right: usize) -> T {
when! {
left == mid => right_res,
right == mid => left_res,
else => {
let mut res = Self::new(left, right);
res.join(&left_res, &right_res);
res
},
}
}
}
impl<
Key: Add<Output = Key> + MulAssign<Delta> + Zero + Copy,
Delta: MulAssign<Delta> + One + Copy,
> SegmentTreeNode for (Key, Delta)
{
fn new(_left: usize, _right: usize) -> Self {
(Key::zero(), Delta::one())
}
fn join(&mut self, left_val: &Self, right_val: &Self) {
self.0 = left_val.0 + right_val.0;
}
fn accumulate(&mut self, value: &Self) {
self.0 *= value.1;
self.1 *= value.1;
}
fn reset_delta(&mut self) {
self.1 = Delta::one();
}
}
#[derive(Clone)]
pub struct SegmentTree<Node> {
n: usize,
nodes: Vec<Node>,
}
impl<Node: SegmentTreeNode> SegmentTree<Node> {
pub fn new(n: usize) -> Self {
Self::from_generator(n, |left| Node::new(left, left + 1))
}
pub fn from_array(arr: Vec<Node>) -> Self {
let n = arr.len();
let mut iter = arr.into_iter();
Self::from_generator(n, |_| iter.next().unwrap())
}
pub fn from_generator<F>(n: usize, gen: F) -> Self
where
F: FnMut(usize) -> Node,
{
if n == 0 {
return Self {
n,
nodes: vec![Node::new(0, 0)],
};
}
let mut res = Self {
n,
nodes: Vec::with_capacity(2 * n - 1),
};
res.init(gen);
res
}
fn init<F>(&mut self, mut f: F)
where
F: FnMut(usize) -> Node,
{
self.init_impl(2 * self.n - 2, 0, self.n, &mut f);
}
fn init_impl<F>(&mut self, root: usize, left: usize, right: usize, f: &mut F)
where
F: FnMut(usize) -> Node,
{
if left + 1 == right {
self.nodes.push(f(left));
} else {
let mid = left + ((right - left) >> 1);
let left_child = root - 2 * (right - mid);
let right_child = root - 1;
self.init_impl(left_child, left, mid, f);
self.init_impl(right_child, mid, right, f);
let mut node = Node::new(left, right);
node.join(&self.nodes[left_child], &self.nodes[right_child]);
self.nodes.push(node);
}
}
pub fn point_query(&mut self, at: usize) -> &Node {
assert!(at < self.n);
self.do_point_query(self.nodes.len() - 1, 0, self.n, at)
}
fn do_point_query(&mut self, root: usize, left: usize, right: usize, at: usize) -> &Node {
if left + 1 == right {
&self.nodes[root]
} else {
let mid = (left + right) >> 1;
self.push_down(root, mid, right);
let left_child = root - 2 * (right - mid);
let right_child = root - 1;
if at < mid {
self.do_point_query(left_child, left, mid, at)
} else {
self.do_point_query(right_child, mid, right, at)
}
}
}
pub fn point_update<T>(&mut self, at: usize, val: T)
where
Node: Pushable<T>,
{
assert!(at < self.n);
self.do_point_update(self.nodes.len() - 1, 0, self.n, at, val);
}
fn do_point_update<T>(&mut self, root: usize, left: usize, right: usize, at: usize, val: T)
where
Node: Pushable<T>,
{
if left + 1 == right {
self.nodes[root].push(val);
} else {
let mid = (left + right) >> 1;
self.push_down(root, mid, right);
let left_child = root - 2 * (right - mid);
let right_child = root - 1;
if at < mid {
self.do_point_update(left_child, left, mid, at, val);
} else {
self.do_point_update(right_child, mid, right, at, val);
}
self.join(root, mid, right);
}
}
pub fn point_through_update<'a, T>(&mut self, at: usize, val: &'a T)
where
Node: Pushable<&'a T>,
{
assert!(at < self.n);
self.do_point_through_update(self.nodes.len() - 1, 0, self.n, at, val);
}
fn do_point_through_update<'a, T>(
&mut self,
root: usize,
left: usize,
right: usize,
at: usize,
val: &'a T,
) where
Node: Pushable<&'a T>,
{
self.nodes[root].push(val);
if left + 1 != right {
let mid = (left + right) >> 1;
self.push_down(root, mid, right);
let left_child = root - 2 * (right - mid);
let right_child = root - 1;
if at < mid {
self.do_point_through_update(left_child, left, mid, at, val);
} else {
self.do_point_through_update(right_child, mid, right, at, val);
}
}
}
pub fn point_operation<Args, Res>(
&mut self,
op: &mut dyn PointOperation<Node, Args, Res>,
args: Args,
) -> Res {
assert_ne!(self.n, 0);
self.do_point_operation(op, self.nodes.len() - 1, 0, self.n, args)
}
fn do_point_operation<Args, Res>(
&mut self,
op: &mut dyn PointOperation<Node, Args, Res>,
root: usize,
left: usize,
right: usize,
args: Args,
) -> Res {
if left + 1 == right {
op.adjust_leaf(&mut self.nodes[root], left, args)
} else {
let mid = (left + right) >> 1;
self.push_down(root, mid, right);
let left_child = root - 2 * (right - mid);
let right_child = root - 1;
let (l, r) = self.nodes.split_at_mut(root);
let (l, m) = l.split_at_mut(right_child);
let direction = op.select_branch(
&mut r[0],
&mut l[left_child],
&mut m[0],
&args,
left,
mid,
right,
);
let res = match direction {
Direction::Left => self.do_point_operation(op, left_child, left, mid, args),
Direction::Right => self.do_point_operation(op, right_child, mid, right, args),
};
self.join(root, mid, right);
res
}
}
pub fn update<'a, T>(&mut self, range: impl RangeBounds<usize>, val: &'a T)
where
Node: Pushable<&'a T>,
{
let (from, to) = clamp(range, self.n);
self.do_update(self.nodes.len() - 1, 0, self.n, from, to, val)
}
pub fn do_update<'a, T>(
&mut self,
root: usize,
left: usize,
right: usize,
from: usize,
to: usize,
val: &'a T,
) where
Node: Pushable<&'a T>,
{
when! {
left >= to || right <= from => {},
left >= from && right <= to => self.nodes[root].push(val),
else => {
let mid = (left + right) >> 1;
self.push_down(root, mid, right);
let left_child = root - 2 * (right - mid);
let right_child = root - 1;
self.do_update(left_child, left, mid, from, to, val);
self.do_update(right_child, mid, right, from, to, val);
self.join(root, mid, right);
},
}
}
pub fn operation<Args, Res>(
&mut self,
range: impl RangeBounds<usize>,
op: &mut dyn Operation<Node, Args, Res>,
args: &Args,
) -> Res {
let (from, to) = clamp(range, self.n);
self.do_operation(self.nodes.len() - 1, 0, self.n, from, to, op, args)
}
pub fn do_operation<Args, Res>(
&mut self,
root: usize,
left: usize,
right: usize,
from: usize,
to: usize,
op: &mut dyn Operation<Node, Args, Res>,
args: &Args,
) -> Res {
when! {
left >= to || right <= from => op.empty_result(left, right, args),
left >= from && right <= to => op.process_result(&mut self.nodes[root], args),
else => {
let mid = (left + right) >> 1;
self.push_down(root, mid, right);
let left_child = root - 2 * (right - mid);
let right_child = root - 1;
let left_result = self.do_operation(left_child, left, mid, from, to, op, args);
let right_result = self.do_operation(right_child, mid, right, from, to, op, args);
self.join(root, mid, right);
op.join_results(left_result, right_result, args)
},
}
}
pub fn binary_search<Res>(
&mut self,
wh: impl FnMut(&Node, &Node) -> Direction,
calc: impl FnMut(&Node, usize) -> Res,
) -> Res {
self.do_binary_search(self.nodes.len() - 1, 0, self.n, wh, calc)
}
fn do_binary_search<Res>(
&mut self,
root: usize,
left: usize,
right: usize,
mut wh: impl FnMut(&Node, &Node) -> Direction,
mut calc: impl FnMut(&Node, usize) -> Res,
) -> Res {
if left + 1 == right {
calc(&self.nodes[root], left)
} else {
let mid = (left + right) >> 1;
self.push_down(root, mid, right);
let left_child = root - 2 * (right - mid);
let right_child = root - 1;
let direction = wh(&self.nodes[left_child], &self.nodes[right_child]);
match direction {
Direction::Left => self.do_binary_search(left_child, left, mid, wh, calc),
Direction::Right => self.do_binary_search(right_child, mid, right, wh, calc),
}
}
}
fn join(&mut self, root: usize, mid: usize, right: usize) {
let left_child = root - 2 * (right - mid);
let right_child = root - 1;
let (left_node, right_node) = self.nodes.split_at_mut(root);
right_node[0].join(&left_node[left_child], &left_node[right_child]);
}
fn do_push_down(&mut self, parent: usize, to: usize) {
let (left_nodes, right_nodes) = self.nodes.split_at_mut(parent);
left_nodes[to].accumulate(&right_nodes[0]);
}
fn push_down(&mut self, root: usize, mid: usize, right: usize) {
self.do_push_down(root, root - 2 * (right - mid));
self.do_push_down(root, root - 1);
self.nodes[root].reset_delta();
}
pub fn query<T>(&mut self, range: impl RangeBounds<usize>) -> T
where
Node: QueryResult<T, ()>,
{
let (from, to) = clamp(range, self.n);
if from >= to {
Node::empty_result(&())
} else {
self.do_query(self.nodes.len() - 1, 0, self.n, from, to, &())
}
}
pub fn query_with_args<T, Args>(&mut self, range: impl RangeBounds<usize>, args: &Args) -> T
where
Node: QueryResult<T, Args>,
{
let (from, to) = clamp(range, self.n);
if from >= to {
Node::empty_result(args)
} else {
self.do_query(self.nodes.len() - 1, 0, self.n, from, to, args)
}
}
fn do_query<T, Args>(
&mut self,
root: usize,
left: usize,
right: usize,
from: usize,
to: usize,
args: &Args,
) -> T
where
Node: QueryResult<T, Args>,
{
if left >= from && right <= to {
self.nodes[root].result(args)
} else {
let mid = (left + right) >> 1;
self.push_down(root, mid, right);
let left_child = root - 2 * (right - mid);
let right_child = root - 1;
when! {
to <= mid => self.do_query(left_child, left, mid, from, to, args),
from >= mid => self.do_query(right_child, mid, right, from, to, args),
else => {
let left_result = self.do_query(left_child, left, mid, from, to, args);
let right_result = self.do_query(right_child, mid, right, from, to, args);
Node::join_results(left_result, right_result, args, left, mid, right)
},
}
}
}
}
pub trait PointOperation<Node: SegmentTreeNode, Args, Res = Node> {
fn adjust_leaf(&mut self, leaf: &mut Node, at: usize, args: Args) -> Res;
fn select_branch(
&mut self,
root: &mut Node,
left_child: &mut Node,
right_child: &mut Node,
args: &Args,
left: usize,
mid: usize,
right: usize,
) -> Direction;
}
pub struct PointOperationClosure<'s, Node: SegmentTreeNode, Args, Res = Node> {
adjust_leaf: Box<dyn FnMut(&mut Node, usize, Args) -> Res + 's>,
select_branch: Box<
dyn FnMut(&mut Node, &mut Node, &mut Node, &Args, usize, usize, usize) -> Direction + 's,
>,
phantom_node: PhantomData<Node>,
phantom_args: PhantomData<Args>,
phantom_res: PhantomData<Res>,
}
impl<'s, Node: SegmentTreeNode, Args, Res> PointOperationClosure<'s, Node, Args, Res> {
pub fn new<F1, F2>(adjust_leaf: F1, select_branch: F2) -> Self
where
F1: FnMut(&mut Node, usize, Args) -> Res + 's,
F2: FnMut(&mut Node, &mut Node, &mut Node, &Args, usize, usize, usize) -> Direction + 's,
{
Self {
adjust_leaf: Box::new(adjust_leaf),
select_branch: Box::new(select_branch),
phantom_node: Default::default(),
phantom_args: Default::default(),
phantom_res: Default::default(),
}
}
}
impl<'s, Node: SegmentTreeNode, Args, Res> PointOperation<Node, Args, Res>
for PointOperationClosure<'s, Node, Args, Res>
{
fn adjust_leaf(&mut self, leaf: &mut Node, at: usize, args: Args) -> Res {
(self.adjust_leaf)(leaf, at, args)
}
fn select_branch(
&mut self,
root: &mut Node,
left_child: &mut Node,
right_child: &mut Node,
args: &Args,
left: usize,
mid: usize,
right: usize,
) -> Direction {
(self.select_branch)(root, left_child, right_child, args, left, mid, right)
}
}
pub trait Operation<Node: SegmentTreeNode, Args, Res = Node> {
fn process_result(&mut self, node: &mut Node, args: &Args) -> Res;
fn join_results(&mut self, left_res: Res, right_res: Res, args: &Args) -> Res;
fn empty_result(&mut self, left: usize, right: usize, args: &Args) -> Res;
}
pub struct OperationClosure<'s, Node: SegmentTreeNode, Args, Res = Node> {
process_result: Box<dyn FnMut(&mut Node, &Args) -> Res + 's>,
join_results: Box<dyn FnMut(Res, Res, &Args) -> Res + 's>,
empty_result: Box<dyn FnMut(usize, usize, &Args) -> Res + 's>,
phantom_node: PhantomData<Node>,
phantom_args: PhantomData<Args>,
phantom_res: PhantomData<Res>,
}
impl<'s, Node: SegmentTreeNode, Args, Res> OperationClosure<'s, Node, Args, Res> {
pub fn new<F1, F2, F3>(process_result: F1, join_results: F2, empty_result: F3) -> Self
where
F1: FnMut(&mut Node, &Args) -> Res + 's,
F2: FnMut(Res, Res, &Args) -> Res + 's,
F3: FnMut(usize, usize, &Args) -> Res + 's,
{
Self {
process_result: Box::new(process_result),
join_results: Box::new(join_results),
empty_result: Box::new(empty_result),
phantom_node: Default::default(),
phantom_args: Default::default(),
phantom_res: Default::default(),
}
}
}
impl<'s, Node: SegmentTreeNode, Args, Res> Operation<Node, Args, Res>
for OperationClosure<'s, Node, Args, Res>
{
fn process_result(&mut self, node: &mut Node, args: &Args) -> Res {
(self.process_result)(node, args)
}
fn join_results(&mut self, left_res: Res, right_res: Res, args: &Args) -> Res {
(self.join_results)(left_res, right_res, args)
}
fn empty_result(&mut self, left: usize, right: usize, args: &Args) -> Res {
(self.empty_result)(left, right, args)
}
}
}
pub mod slice_ext {
pub mod backward {
use std::ops::Index;
use std::ops::IndexMut;
pub struct Back(pub usize);
impl<T> Index<Back> for [T] {
type Output = T;
fn index(&self, index: Back) -> &Self::Output {
&self[self.len() - index.0 - 1]
}
}
impl<T> IndexMut<Back> for [T] {
fn index_mut(&mut self, index: Back) -> &mut Self::Output {
&mut self[self.len() - index.0 - 1]
}
}
impl<T> Index<Back> for Vec<T> {
type Output = T;
fn index(&self, index: Back) -> &Self::Output {
self.as_slice().index(index)
}
}
impl<T> IndexMut<Back> for Vec<T> {
fn index_mut(&mut self, index: Back) -> &mut Self::Output {
self.as_mut_slice().index_mut(index)
}
}
}
pub mod bounds {
pub trait Bounds<T: PartialOrd> {
fn lower_bound(&self, el: &T) -> usize;
fn upper_bound(&self, el: &T) -> usize;
fn bin_search(&self, el: &T) -> Option<usize>;
fn more(&self, el: &T) -> usize;
fn more_or_eq(&self, el: &T) -> usize;
fn less(&self, el: &T) -> usize;
fn less_or_eq(&self, el: &T) -> usize;
}
impl<T: PartialOrd> Bounds<T> for [T] {
fn lower_bound(&self, el: &T) -> usize {
let mut left = 0;
let mut right = self.len();
while left < right {
let mid = left + ((right - left) >> 1);
if &self[mid] < el {
left = mid + 1;
} else {
right = mid;
}
}
left
}
fn upper_bound(&self, el: &T) -> usize {
let mut left = 0;
let mut right = self.len();
while left < right {
let mid = left + ((right - left) >> 1);
if &self[mid] <= el {
left = mid + 1;
} else {
right = mid;
}
}
left
}
fn bin_search(&self, el: &T) -> Option<usize> {
let at = self.lower_bound(el);
if at == self.len() || &self[at] != el {
None
} else {
Some(at)
}
}
fn more(&self, el: &T) -> usize {
self.len() - self.upper_bound(el)
}
fn more_or_eq(&self, el: &T) -> usize {
self.len() - self.lower_bound(el)
}
fn less(&self, el: &T) -> usize {
self.lower_bound(el)
}
fn less_or_eq(&self, el: &T) -> usize {
self.upper_bound(el)
}
}
}
pub mod compress {
use crate::algo_lib::collections::slice_ext::bounds::Bounds;
use std::mem::MaybeUninit;
#[derive(Eq, PartialEq, Debug)]
pub struct Compressed<T, const N: usize> {
pub order: Vec<T>,
pub arrs: [Vec<usize>; N],
}
pub fn compress<T: Ord + Clone, const N: usize>(vs: [&[T]; N]) -> Compressed<T, N> {
let mut size = 0;
for v in &vs {
size += v.len();
}
let mut all = Vec::with_capacity(size);
for v in &vs {
all.extend_from_slice(v);
}
all.sort();
all.dedup();
let arrs = unsafe {
let mut arr: MaybeUninit<[Vec<usize>; N]> = MaybeUninit::uninit();
for (i, v) in vs.iter().enumerate() {
let mut cur = Vec::with_capacity(vs[i].len());
for vv in *v {
cur.push(all.bin_search(vv).unwrap());
}
arr.as_mut_ptr().cast::<Vec<usize>>().add(i).write(cur);
}
arr.assume_init()
};
Compressed { order: all, arrs }
}
}
pub mod indices {
use std::ops::Range;
pub trait Indices {
fn indices(&self) -> Range<usize>;
}
impl<T> Indices for [T] {
fn indices(&self) -> Range<usize> {
0..self.len()
}
}
}
}
pub mod vec_ext {
pub mod default {
pub fn default_vec<T: Default>(len: usize) -> Vec<T> {
let mut v = Vec::with_capacity(len);
for _ in 0..len {
v.push(T::default());
}
v
}
}
}
}
pub mod io {
pub mod input {
use crate::algo_lib::collections::vec_ext::default::default_vec;
use std::io::Read;
use std::mem::MaybeUninit;
pub struct Input<'s> {
input: &'s mut (dyn Read + Send),
buf: Vec<u8>,
at: usize,
buf_read: usize,
}
macro_rules! read_impl {
($t: ty, $read_name: ident, $read_vec_name: ident) => {
pub fn $read_name(&mut self) -> $t {
self.read()
}
pub fn $read_vec_name(&mut self, len: usize) -> Vec<$t> {
self.read_vec(len)
}
};
($t: ty, $read_name: ident, $read_vec_name: ident, $read_pair_vec_name: ident) => {
read_impl!($t, $read_name, $read_vec_name);
pub fn $read_pair_vec_name(&mut self, len: usize) -> Vec<($t, $t)> {
self.read_vec(len)
}
};
}
impl<'s> Input<'s> {
const DEFAULT_BUF_SIZE: usize = 4096;
pub fn new(input: &'s mut (dyn Read + Send)) -> Self {
Self {
input,
buf: default_vec(Self::DEFAULT_BUF_SIZE),
at: 0,
buf_read: 0,
}
}
pub fn new_with_size(input: &'s mut (dyn Read + Send), buf_size: usize) -> Self {
Self {
input,
buf: default_vec(buf_size),
at: 0,
buf_read: 0,
}
}
pub fn get(&mut self) -> Option<u8> {
if self.refill_buffer() {
let res = self.buf[self.at];
self.at += 1;
if res == b'\r' {
if self.refill_buffer() && self.buf[self.at] == b'\n' {
self.at += 1;
}
return Some(b'\n');
}
Some(res)
} else {
None
}
}
pub fn peek(&mut self) -> Option<u8> {
if self.refill_buffer() {
let res = self.buf[self.at];
Some(if res == b'\r' { b'\n' } else { res })
} else {
None
}
}
pub fn skip_whitespace(&mut self) {
while let Some(b) = self.peek() {
if !b.is_ascii_whitespace() {
return;
}
self.get();
}
}
pub fn next_token(&mut self) -> Option<Vec<u8>> {
self.skip_whitespace();
let mut res = Vec::new();
while let Some(c) = self.get() {
if c.is_ascii_whitespace() {
break;
}
res.push(c);
}
if res.is_empty() {
None
} else {
Some(res)
}
}
//noinspection RsSelfConvention
pub fn is_exhausted(&mut self) -> bool {
self.peek().is_none()
}
//noinspection RsSelfConvention
pub fn is_empty(&mut self) -> bool {
self.skip_whitespace();
self.is_exhausted()
}
pub fn read<T: Readable>(&mut self) -> T {
T::read(self)
}
pub fn read_vec<T: Readable>(&mut self, size: usize) -> Vec<T> {
let mut res = Vec::with_capacity(size);
for _ in 0..size {
res.push(self.read());
}
res
}
pub fn read_char(&mut self) -> u8 {
self.skip_whitespace();
self.get().unwrap()
}
read_impl!(u32, read_unsigned, read_unsigned_vec);
read_impl!(u64, read_u64, read_u64_vec);
read_impl!(usize, read_size, read_size_vec, read_size_pair_vec);
read_impl!(i32, read_int, read_int_vec, read_int_pair_vec);
read_impl!(i64, read_long, read_long_vec, read_long_pair_vec);
read_impl!(i128, read_i128, read_i128_vec);
fn refill_buffer(&mut self) -> bool {
if self.at == self.buf_read {
self.at = 0;
self.buf_read = self.input.read(&mut self.buf).unwrap();
self.buf_read != 0
} else {
true
}
}
}
pub trait Readable {
fn read(input: &mut Input) -> Self;
}
impl Readable for u8 {
fn read(input: &mut Input) -> Self {
input.read_char()
}
}
impl<T: Readable> Readable for Vec<T> {
fn read(input: &mut Input) -> Self {
let size = input.read();
input.read_vec(size)
}
}
impl<T: Readable, const SIZE: usize> Readable for [T; SIZE] {
fn read(input: &mut Input) -> Self {
unsafe {
let mut res = MaybeUninit::<[T; SIZE]>::uninit();
for i in 0..SIZE {
let ptr: *mut T = (*res.as_mut_ptr()).as_mut_ptr();
ptr.add(i).write(input.read::<T>());
}
res.assume_init()
}
}
}
macro_rules! read_integer {
($($t:ident)+) => {$(
impl Readable for $t {
fn read(input: &mut Input) -> Self {
input.skip_whitespace();
let mut c = input.get().unwrap();
let sgn = match c {
b'-' => {
c = input.get().unwrap();
true
}
b'+' => {
c = input.get().unwrap();
false
}
_ => false,
};
let mut res = 0;
loop {
assert!(c.is_ascii_digit());
res *= 10;
let d = (c - b'0') as $t;
if sgn {
res -= d;
} else {
res += d;
}
match input.get() {
None => break,
Some(ch) => {
if ch.is_ascii_whitespace() {
break;
} else {
c = ch;
}
}
}
}
res
}
}
)+};
}
read_integer!(i8 i16 i32 i64 i128 isize u16 u32 u64 u128 usize);
macro_rules! tuple_readable {
($($name:ident)+) => {
impl<$($name: Readable), +> Readable for ($($name,)+) {
fn read(input: &mut Input) -> Self {
($($name::read(input),)+)
}
}
}
}
tuple_readable! {T}
tuple_readable! {T U}
tuple_readable! {T U V}
tuple_readable! {T U V X}
tuple_readable! {T U V X Y}
tuple_readable! {T U V X Y Z}
tuple_readable! {T U V X Y Z A}
tuple_readable! {T U V X Y Z A B}
tuple_readable! {T U V X Y Z A B C}
tuple_readable! {T U V X Y Z A B C D}
tuple_readable! {T U V X Y Z A B C D E}
tuple_readable! {T U V X Y Z A B C D E F}
impl Read for Input<'_> {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
if self.at == self.buf_read {
self.input.read(buf)
} else {
let mut i = 0;
while i < buf.len() && self.at < self.buf_read {
buf[i] = self.buf[self.at];
i += 1;
self.at += 1;
}
Ok(i)
}
}
}
}
pub mod output {
use crate::algo_lib::collections::vec_ext::default::default_vec;
use std::cmp::Reverse;
use std::io::stderr;
use std::io::Stderr;
use std::io::Write;
#[derive(Copy, Clone)]
pub enum BoolOutput {
YesNo,
YesNoCaps,
PossibleImpossible,
Custom(&'static str, &'static str),
}
impl BoolOutput {
pub fn output(&self, output: &mut Output, val: bool) {
(if val { self.yes() } else { self.no() }).write(output);
}
fn yes(&self) -> &str {
match self {
BoolOutput::YesNo => "Yes",
BoolOutput::YesNoCaps => "YES",
BoolOutput::PossibleImpossible => "Possible",
BoolOutput::Custom(yes, _) => yes,
}
}
fn no(&self) -> &str {
match self {
BoolOutput::YesNo => "No",
BoolOutput::YesNoCaps => "NO",
BoolOutput::PossibleImpossible => "Impossible",
BoolOutput::Custom(_, no) => no,
}
}
}
pub struct Output<'s> {
output: &'s mut dyn Write,
buf: Vec<u8>,
at: usize,
auto_flush: bool,
bool_output: BoolOutput,
precision: Option<usize>,
}
impl<'s> Output<'s> {
const DEFAULT_BUF_SIZE: usize = 4096;
pub fn new(output: &'s mut dyn Write) -> Self {
Self {
output,
buf: default_vec(Self::DEFAULT_BUF_SIZE),
at: 0,
auto_flush: false,
bool_output: BoolOutput::YesNoCaps,
precision: None,
}
}
pub fn new_with_auto_flush(output: &'s mut dyn Write) -> Self {
Self {
output,
buf: default_vec(Self::DEFAULT_BUF_SIZE),
at: 0,
auto_flush: true,
bool_output: BoolOutput::YesNoCaps,
precision: None,
}
}
pub fn flush(&mut self) {
if self.at != 0 {
self.output.write_all(&self.buf[..self.at]).unwrap();
self.output.flush().unwrap();
self.at = 0;
}
}
pub fn print<T: Writable>(&mut self, s: T) {
s.write(self);
self.maybe_flush();
}
pub fn print_line<T: Writable>(&mut self, s: T) {
self.print(s);
self.put(b'\n');
self.maybe_flush();
}
pub fn put(&mut self, b: u8) {
self.buf[self.at] = b;
self.at += 1;
if self.at == self.buf.len() {
self.flush();
}
}
pub fn maybe_flush(&mut self) {
if self.auto_flush {
self.flush();
}
}
pub fn print_per_line<T: Writable>(&mut self, arg: &[T]) {
self.print_per_line_iter(arg.iter());
}
pub fn print_iter<T: Writable, I: Iterator<Item = T>>(&mut self, iter: I) {
let mut first = true;
for e in iter {
if first {
first = false;
} else {
self.put(b' ');
}
e.write(self);
}
}
pub fn print_line_iter<T: Writable, I: Iterator<Item = T>>(&mut self, iter: I) {
self.print_iter(iter);
self.put(b'\n');
}
pub fn print_per_line_iter<T: Writable, I: Iterator<Item = T>>(&mut self, iter: I) {
for e in iter {
e.write(self);
self.put(b'\n');
}
}
pub fn set_bool_output(&mut self, bool_output: BoolOutput) {
self.bool_output = bool_output;
}
pub fn set_precision(&mut self, precision: usize) {
self.precision = Some(precision);
}
pub fn reset_precision(&mut self) {
self.precision = None;
}
pub fn get_precision(&self) -> Option<usize> {
self.precision
}
}
impl Write for Output<'_> {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
let mut start = 0usize;
let mut rem = buf.len();
while rem > 0 {
let len = (self.buf.len() - self.at).min(rem);
self.buf[self.at..self.at + len].copy_from_slice(&buf[start..start + len]);
self.at += len;
if self.at == self.buf.len() {
self.flush();
}
start += len;
rem -= len;
}
self.maybe_flush();
Ok(buf.len())
}
fn flush(&mut self) -> std::io::Result<()> {
self.flush();
Ok(())
}
}
pub trait Writable {
fn write(&self, output: &mut Output);
}
impl Writable for &str {
fn write(&self, output: &mut Output) {
output.write_all(self.as_bytes()).unwrap();
}
}
impl Writable for String {
fn write(&self, output: &mut Output) {
output.write_all(self.as_bytes()).unwrap();
}
}
impl Writable for char {
fn write(&self, output: &mut Output) {
output.put(*self as u8);
}
}
impl Writable for u8 {
fn write(&self, output: &mut Output) {
output.put(*self);
}
}
impl<T: Writable> Writable for [T] {
fn write(&self, output: &mut Output) {
output.print_iter(self.iter());
}
}
impl<T: Writable, const N: usize> Writable for [T; N] {
fn write(&self, output: &mut Output) {
output.print_iter(self.iter());
}
}
impl<T: Writable + ?Sized> Writable for &T {
fn write(&self, output: &mut Output) {
T::write(self, output)
}
}
impl<T: Writable> Writable for Vec<T> {
fn write(&self, output: &mut Output) {
self.as_slice().write(output);
}
}
impl Writable for () {
fn write(&self, _output: &mut Output) {}
}
macro_rules! write_to_string {
($($t:ident)+) => {$(
impl Writable for $t {
fn write(&self, output: &mut Output) {
self.to_string().write(output);
}
}
)+};
}
write_to_string!(u16 u32 u64 u128 usize i8 i16 i32 i64 i128 isize);
macro_rules! tuple_writable {
($name0:ident $($name:ident: $id:tt )*) => {
impl<$name0: Writable, $($name: Writable,)*> Writable for ($name0, $($name,)*) {
fn write(&self, out: &mut Output) {
self.0.write(out);
$(
out.put(b' ');
self.$id.write(out);
)*
}
}
}
}
tuple_writable! {T}
tuple_writable! {T U:1}
tuple_writable! {T U:1 V:2}
tuple_writable! {T U:1 V:2 X:3}
tuple_writable! {T U:1 V:2 X:3 Y:4}
tuple_writable! {T U:1 V:2 X:3 Y:4 Z:5}
tuple_writable! {T U:1 V:2 X:3 Y:4 Z:5 A:6}
tuple_writable! {T U:1 V:2 X:3 Y:4 Z:5 A:6 B:7}
tuple_writable! {T U:1 V:2 X:3 Y:4 Z:5 A:6 B:7 C:8}
impl<T: Writable> Writable for Option<T> {
fn write(&self, output: &mut Output) {
match self {
None => (-1).write(output),
Some(t) => t.write(output),
}
}
}
impl Writable for bool {
fn write(&self, output: &mut Output) {
let bool_output = output.bool_output;
bool_output.output(output, *self)
}
}
impl<T: Writable> Writable for Reverse<T> {
fn write(&self, output: &mut Output) {
self.0.write(output);
}
}
static mut ERR: Option<Stderr> = None;
pub fn err() -> Output<'static> {
unsafe {
if ERR.is_none() {
ERR = Some(stderr());
}
Output::new_with_auto_flush(ERR.as_mut().unwrap())
}
}
}
}
pub mod misc {
pub mod direction {
#[derive(Copy, Clone)]
pub enum Direction {
Left,
Right,
}
}
pub mod test_type {
pub enum TestType {
Single,
MultiNumber,
MultiEof,
}
pub enum TaskType {
Classic,
Interactive,
}
}
pub mod when {
#[macro_export]
macro_rules! when {
{$($cond: expr => $then: expr,)*} => {
match () {
$(_ if $cond => $then,)*
_ => unreachable!(),
}
};
{$($cond: expr => $then: expr,)* else $(=>)? $else: expr$(,)?} => {
match () {
$(_ if $cond => $then,)*
_ => $else,
}
};
}
}
}
pub mod numbers {
pub mod num_traits {
pub mod algebra {
use crate::algo_lib::numbers::num_traits::invertible::Invertible;
use std::ops::Add;
use std::ops::AddAssign;
use std::ops::Div;
use std::ops::DivAssign;
use std::ops::Mul;
use std::ops::MulAssign;
use std::ops::Neg;
use std::ops::Rem;
use std::ops::RemAssign;
use std::ops::Sub;
use std::ops::SubAssign;
pub trait Zero {
fn zero() -> Self;
}
pub trait One {
fn one() -> Self;
}
pub trait AdditionMonoid: Add<Output = Self> + AddAssign + Zero + Eq + Sized {}
impl<T: Add<Output = Self> + AddAssign + Zero + Eq> AdditionMonoid for T {}
pub trait AdditionMonoidWithSub: AdditionMonoid + Sub<Output = Self> + SubAssign {}
impl<T: AdditionMonoid + Sub<Output = Self> + SubAssign> AdditionMonoidWithSub for T {}
pub trait AdditionGroup: AdditionMonoidWithSub + Neg<Output = Self> {}
impl<T: AdditionMonoidWithSub + Neg<Output = Self>> AdditionGroup for T {}
pub trait MultiplicationMonoid: Mul<Output = Self> + MulAssign + One + Eq + Sized {}
impl<T: Mul<Output = Self> + MulAssign + One + Eq> MultiplicationMonoid for T {}
pub trait IntegerMultiplicationMonoid:
MultiplicationMonoid + Div<Output = Self> + Rem<Output = Self> + DivAssign + RemAssign
{
}
impl<T: MultiplicationMonoid + Div<Output = Self> + Rem<Output = Self> + DivAssign + RemAssign>
IntegerMultiplicationMonoid for T
{
}
pub trait MultiplicationGroup:
MultiplicationMonoid + Div<Output = Self> + DivAssign + Invertible<Output = Self>
{
}
impl<T: MultiplicationMonoid + Div<Output = Self> + DivAssign + Invertible<Output = Self>>
MultiplicationGroup for T
{
}
pub trait SemiRing: AdditionMonoid + MultiplicationMonoid {}
impl<T: AdditionMonoid + MultiplicationMonoid> SemiRing for T {}
pub trait SemiRingWithSub: AdditionMonoidWithSub + SemiRing {}
impl<T: AdditionMonoidWithSub + SemiRing> SemiRingWithSub for T {}
pub trait Ring: SemiRing + AdditionGroup {}
impl<T: SemiRing + AdditionGroup> Ring for T {}
pub trait IntegerSemiRing: SemiRing + IntegerMultiplicationMonoid {}
impl<T: SemiRing + IntegerMultiplicationMonoid> IntegerSemiRing for T {}
pub trait IntegerSemiRingWithSub: SemiRingWithSub + IntegerSemiRing {}
impl<T: SemiRingWithSub + IntegerSemiRing> IntegerSemiRingWithSub for T {}
pub trait IntegerRing: IntegerSemiRing + Ring {}
impl<T: IntegerSemiRing + Ring> IntegerRing for T {}
pub trait Field: Ring + MultiplicationGroup {}
impl<T: Ring + MultiplicationGroup> Field for T {}
macro_rules! zero_one_integer_impl {
($($t: ident)+) => {$(
impl Zero for $t {
fn zero() -> Self {
0
}
}
impl One for $t {
fn one() -> Self {
1
}
}
)+};
}
zero_one_integer_impl!(i128 i64 i32 i16 i8 isize u128 u64 u32 u16 u8 usize);
}
pub mod as_index {
pub trait AsIndex {
fn from_index(idx: usize) -> Self;
fn to_index(self) -> usize;
}
macro_rules! from_index_impl {
($($t: ident)+) => {$(
impl AsIndex for $t {
fn from_index(idx: usize) -> Self {
idx as $t
}
fn to_index(self) -> usize {
self as usize
}
}
)+};
}
from_index_impl!(i128 i64 i32 i16 i8 isize u128 u64 u32 u16 u8 usize);
}
pub mod invertible {
pub trait Invertible {
type Output;
fn inv(&self) -> Option<Self::Output>;
}
}
}
pub mod num_utils {
use crate::algo_lib::numbers::num_traits::algebra::AdditionMonoid;
use crate::algo_lib::numbers::num_traits::algebra::IntegerRing;
use crate::algo_lib::numbers::num_traits::algebra::MultiplicationMonoid;
use crate::algo_lib::numbers::num_traits::as_index::AsIndex;
pub fn factorials<T: MultiplicationMonoid + Copy + AsIndex>(len: usize) -> Vec<T> {
let mut res = Vec::new();
if len > 0 {
res.push(T::one());
}
while res.len() < len {
res.push((*res.last().unwrap()) * T::from_index(res.len()));
}
res
}
pub fn powers<T: MultiplicationMonoid + Copy>(base: T, len: usize) -> Vec<T> {
let mut res = Vec::new();
if len > 0 {
res.push(T::one());
}
while res.len() < len {
res.push((*res.last().unwrap()) * base);
}
res
}
pub struct Powers<T: MultiplicationMonoid + Copy> {
small: Vec<T>,
big: Vec<T>,
}
impl<T: MultiplicationMonoid + Copy> Powers<T> {
pub fn new(base: T, len: usize) -> Self {
let small = powers(base, len);
let big = powers(small[len - 1] * base, len);
Self { small, big }
}
pub fn power(&self, exp: usize) -> T {
debug_assert!(exp < self.small.len() * self.small.len());
self.big[exp / self.small.len()] * self.small[exp % self.small.len()]
}
}
pub fn factorial<T: MultiplicationMonoid + AsIndex>(n: usize) -> T {
let mut res = T::one();
for i in 1..=n {
res *= T::from_index(i);
}
res
}
pub trait PartialSums<T> {
fn partial_sums(&self) -> Vec<T>;
}
impl<T: AdditionMonoid + Copy> PartialSums<T> for [T] {
fn partial_sums(&self) -> Vec<T> {
let mut res = Vec::with_capacity(self.len() + 1);
res.push(T::zero());
for i in self.iter() {
res.push(*res.last().unwrap() + *i);
}
res
}
}
pub trait UpperDiv {
fn upper_div(self, other: Self) -> Self;
}
impl<T: IntegerRing + Copy> UpperDiv for T {
fn upper_div(self, other: Self) -> Self {
(self + other - Self::one()) / other
}
}
}
}
}
fn main() {
let mut sin = std::io::stdin();
let input = algo_lib::io::input::Input::new(&mut sin);
let mut stdout = std::io::stdout();
let output = algo_lib::io::output::Output::new(&mut stdout);
solution::run(input, output);
}
这程序好像有点Bug,我给组数据试试?
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 2168kb
input:
2 6 20 1 1 60 0 2 2 60 0 2 2 120 1 1 2 180 1 1 2 180 0 2 2 300 1 2 20 1 1 300 1 2 2 300 1
output:
120 160 -1
result:
ok 3 number(s): "120 160 -1"
Test #2:
score: 0
Accepted
time: 106ms
memory: 2044kb
input:
400000 1 1 1 1000000000 1000000000000 1 1 1 2 1000000000 1 0 1 1 2 1 1000000000000 1 1 1 1 1 1000000000000 1 1 1 2 1000000000 1000000000000 0 1 1 2 1 1 0 1 1000000000000 2 1000000000 1 0 1 1000000000000 1 1 1 0 1 1000000000000 1 1 1 1 1 1000000000000 2 1000000000 1000000000000 0 1 1 1 1000000000 1 0...
output:
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
result:
ok 400000 numbers
Test #3:
score: 0
Accepted
time: 57ms
memory: 2340kb
input:
10000 4 542575683220 2 101300788 7308006925 1 1 604560531 257884671293 0 1 46911674 422781533607 0 2 10550533 771273976896 1 116 793781361888 1 819065134 15224463201 1 2 552573547 15992997563 1 2 424217 27032314690 0 2 70252887 41541882886 0 2 274093456 46129251985 0 1 458919850 46344406806 1 1 8416...
output:
-1 -1 -1 -1 -1 66660446969 904724933033 -1 -1 -1 -1 -1 -1 37226106549 311799565893 -1 -1 -1 -1 -1 -1 48301734080 375528816957 -1 -1 -1 459021288402 632610827258 -1 -1 -1 -1 -1 -1 -1 688320095661 898231263806 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 21800224424...
result:
ok 10846 numbers
Test #4:
score: 0
Accepted
time: 39ms
memory: 2416kb
input:
1000 41 699991536758 1 846433454 45030190307 1 2 882516075 48235731920 1 1 488580715 68600854082 1 2 467682948 92731902940 1 1 218024396 138543808852 1 2 124969525 150196554430 0 2 989301314 181283691649 1 2 752581868 202920989593 0 2 164838619 269703109427 0 1 696316428 295229433897 0 2 711333918 3...
output:
329739379675 908226682656 -1 -1 -1 -1 -1 424620801981 831021050071 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6963797897 888755778656 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 568768655870 677350535270 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
result:
ok 1042 numbers
Test #5:
score: 0
Accepted
time: 48ms
memory: 3552kb
input:
100 5622 365182448552 2 639763453 293138584 0 1 150269480 461335412 1 1 215320018 935778069 1 2 455090474 986867198 1 2 137209887 1025838937 1 1 639542200 1323284104 0 2 975624632 1331236944 1 1 419729668 1535875032 0 1 754484749 1638561677 1 2 718600604 2047704086 0 2 793817561 2082808091 1 2 89416...
output:
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
result:
ok 100 numbers
Test #6:
score: 0
Accepted
time: 49ms
memory: 7900kb
input:
10 17647 497735816936 2 674642608 86555331 1 1 362561577 201254993 1 2 311798376 317505931 0 1 997152835 354905086 0 1 501042015 406191428 1 2 346791377 498440233 0 2 883536093 569248570 0 1 242082992 714310537 1 1 149897006 726750432 1 2 951017299 800159980 0 2 258554143 816615965 0 1 681430878 825...
output:
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
result:
ok 10 numbers
Test #7:
score: 0
Accepted
time: 46ms
memory: 23980kb
input:
1 400000 263629556026 2 954826535 1576313 1 1 970048058 1644473 1 1 100070583 1779363 0 1 862973854 2602197 0 1 544583759 6163089 1 1 292939527 13244435 1 1 818324382 16877678 1 1 255969879 32429661 0 1 578761398 33091132 1 2 337038014 34601245 0 1 46604309 39135309 0 2 501363911 40833345 1 1 210491...
output:
-1
result:
ok 1 number(s): "-1"
Test #8:
score: 0
Accepted
time: 222ms
memory: 50448kb
input:
1 399863 925298013757 2 100628989 1 0 2 879908544 1 0 2 835150000 1 0 2 965097317 1 0 2 806475166 1 0 2 883153545 1 0 2 537871549 1 0 2 666240466 1 0 2 772690810 1 0 2 468000116 1 0 2 57197741 1 0 2 752910244 1 0 2 34579873 1 0 2 764798890 1 0 2 385606621 1 0 2 359331506 1 0 2 280339733 1 0 2 485810...
output:
93600917303 93601131398
result:
ok 2 number(s): "93600917303 93601131398"
Test #9:
score: 0
Accepted
time: 226ms
memory: 50452kb
input:
1 399494 961261170252 1 500382911 1 0 1 343020544 1 0 1 754347645 1 0 1 333064084 1 0 1 478385269 1 0 1 622968098 1 0 1 980169601 1 0 1 352209103 1 0 1 402748538 1 0 1 218430474 1 0 1 288936411 1 0 1 5773706 1 0 1 698161932 1 0 1 366209929 1 0 1 73511871 1 0 1 725720796 1 0 1 888663191 1 0 1 3011404...
output:
93601000787 93601218921
result:
ok 2 number(s): "93601000787 93601218921"
Test #10:
score: 0
Accepted
time: 27ms
memory: 14564kb
input:
1 400000 663010 1 680238422 483214 0 1 680238422 521442 0 1 680238422 609593 0 1 680238422 1476058 0 1 680238422 2424603 0 1 680238422 2483379 0 1 680238422 2777054 0 1 680238422 3992033 0 1 680238422 4038346 0 1 680238422 4500144 0 1 680238422 4613302 0 1 680238422 4698260 0 1 680238422 4860707 0 1...
output:
-1
result:
ok 1 number(s): "-1"
Test #11:
score: 0
Accepted
time: 39ms
memory: 14512kb
input:
1 400000 79784 1 110051200 202567778970 0 1 110051200 202567778970 0 1 110051200 202567778970 0 1 110051200 202567778970 0 1 110051200 202567778970 0 1 110051200 202567778970 0 1 110051200 202567778970 0 1 110051200 202567778970 0 1 110051200 202567778970 0 1 110051200 202567778970 0 1 110051200 202...
output:
202567778970 879492417995
result:
ok 2 number(s): "202567778970 879492417995"
Test #12:
score: 0
Accepted
time: 36ms
memory: 14500kb
input:
1 400000 48790 1 554756625 480690 0 1 554756625 3230620 0 1 554756625 3409127 0 1 514075804 3753536 0 1 554756625 4724772 0 2 188054527 5311431 0 1 100903989 5807895 0 1 933163205 7291004 0 2 382472190 8139517 0 1 239315307 8310712 0 1 554756625 8348744 0 1 14438382 8939856 0 1 554756625 11989642 0 ...
output:
13251717318 599133935039
result:
ok 2 number(s): "13251717318 599133935039"
Test #13:
score: 0
Accepted
time: 34ms
memory: 14688kb
input:
1 400000 255041 2 181766528 25787236213 0 2 181766528 25787236213 0 2 181766528 25787236213 0 2 181766528 25787236213 0 2 181766528 25787236213 0 2 181766528 25787236213 0 2 181766528 25787236213 0 2 181766528 25787236213 0 2 181766528 25787236213 0 2 181766528 25787236213 0 2 181766528 25787236213 ...
output:
306238410801 624516496355
result:
ok 2 number(s): "306238410801 624516496355"
Test #14:
score: 0
Accepted
time: 36ms
memory: 14584kb
input:
1 400000 952892 1 669079782 5249 0 1 669079782 1051034 0 1 669079782 1478798 0 1 643031526 2194715 0 1 669079782 2318113 0 2 195012273 3054972 0 2 608030266 3674227 0 1 927916867 3904831 0 1 669079782 4349111 0 2 214184786 6595409 0 1 669079782 6663358 0 2 403805672 6933063 0 1 669079782 7146955 0 2...
output:
13932447919 987373706861
result:
ok 2 number(s): "13932447919 987373706861"
Test #15:
score: 0
Accepted
time: 31ms
memory: 14552kb
input:
1 400000 445351 2 43725609 629636445 0 2 43725609 629636445 0 2 43725609 629636445 0 2 43725609 629636445 0 2 43725609 629636445 0 2 43725609 629636445 0 2 43725609 629636445 0 2 43725609 629636445 0 2 43725609 629636445 0 2 43725609 629636445 0 2 43725609 629636445 0 2 43725609 629636445 0 2 437256...
output:
-1
result:
ok 1 number(s): "-1"
Test #16:
score: 0
Accepted
time: 39ms
memory: 15412kb
input:
1 400000 737917 2 104548428 355151 0 2 798447330 563764 0 2 807313778 726293 0 1 225967449 777825 0 1 76979820 830949 0 2 798447330 1204358 0 1 152843063 1242227 0 1 147816717 1604061 0 2 884732354 2045708 0 1 899307173 2280899 0 1 923713510 2447044 0 2 807313778 2651301 0 2 148086652 2704087 0 2 79...
output:
294972586721 744194775850
result:
ok 2 number(s): "294972586721 744194775850"
Test #17:
score: 0
Accepted
time: 32ms
memory: 15244kb
input:
1 400000 797979 1 698025121 76252326 0 1 698025121 76252326 0 1 698025121 76252326 0 1 698025121 76252326 0 1 698025121 76252326 0 1 698025121 76252326 0 1 698025121 76252326 0 1 698025121 76252326 0 1 698025121 76252326 0 1 698025121 76252326 0 1 698025121 76252326 0 1 698025121 76252326 0 1 698025...
output:
297321818946 857889105465
result:
ok 2 number(s): "297321818946 857889105465"
Test #18:
score: 0
Accepted
time: 50ms
memory: 19560kb
input:
1 400000 559759 1 334035078 470519 0 1 768140446 2967944 0 1 77040897 3088991 0 2 493261355 4283608 0 2 914055376 4561618 0 1 249929265 5223548 0 1 471764388 5364482 0 1 438202587 6820774 0 1 548072976 7173586 0 1 152064110 7904320 0 2 187798068 9277616 0 2 554380228 11571775 0 2 999624048 11848525 ...
output:
368607061812 459867556579
result:
ok 2 number(s): "368607061812 459867556579"
Test #19:
score: 0
Accepted
time: 39ms
memory: 19364kb
input:
1 400000 923129 1 830682125 6777784 0 1 830682125 6777784 0 1 830682125 6777784 0 1 830682125 6777784 1 1 830682125 6777784 0 1 830682125 6777784 0 1 830682125 6777784 0 2 502376403 98306211 0 2 502376403 98306211 0 2 502376403 98306211 0 2 502376403 98306211 0 2 502376403 98306211 0 2 502376403 983...
output:
603264713406 904051411073
result:
ok 2 number(s): "603264713406 904051411073"
Test #20:
score: 0
Accepted
time: 124ms
memory: 2492kb
input:
10000 34 713414155711 1 353899840 4470478880 1 1 101300788 14617874162 1 2 224463201 46129251985 1 2 997067155 53850132914 1 1 493411629 67237771644 1 2 60685412 153612550178 1 2 932182989 159471048139 1 2 821881991 174028196456 1 2 887385900 188331357182 1 2 819065134 200111294061 1 2 348545253 247...
output:
483871970490 840598269617 196200037892 970964066001 283567194848 914830957817 -1 -1 224079150450 800412473197 100330184885 227585151128 50506210564 783882723066 406628103960 924434625801 634770465011 738356832148 16323343084 723566375795 28913275304 938587397050 -1 461193028837 931629993981 36470471...
result:
ok 18515 numbers
Test #21:
score: 0
Accepted
time: 137ms
memory: 2708kb
input:
1000 60 171285665612 1 202084572 21122606424 1 2 658066585 35408059059 1 1 23311972 51059588296 1 1 555006790 53867325184 1 2 668895851 61404100899 1 2 439334198 66467682948 1 2 814813731 75505419882 1 2 563694648 84052137524 1 1 863531125 84160720592 1 2 666879230 92731902940 1 1 310726910 12688787...
output:
200468370512 983989301314 105910501928 853497904904 928492782007 939126373321 342619682920 456502006066 282459092744 713342359655 99203627100 110822178667 496813497898 828241040007 5149945202 998323717204 20989066921 948454205300 353986139415 989439227450 134191973984 722450971884 64821218433 932293...
result:
ok 1942 numbers
Test #22:
score: 0
Accepted
time: 144ms
memory: 4748kb
input:
100 302 495480207413 1 157557196 5191700656 1 2 688131848 7822346081 1 2 302959585 11342249961 1 2 667487485 12602857386 1 1 981368818 14235797064 1 2 862638974 15778895657 1 2 938801239 16033062185 1 2 141565804 18783237506 1 2 600109241 21882439145 1 1 866713826 23983150467 1 2 17855262 2555711801...
output:
12878839367 465356894994 98670299607 984006430918 659460612429 921298289091 261717617158 758562225078 16656906317 946242259897 604865303455 742610447485 65635714807 979156099520 414255260549 900331635889 86571338038 510051964019 302298934987 885584590000 15514653060 928519135170 11536475812 99954734...
result:
ok 197 numbers
Test #23:
score: 0
Accepted
time: 160ms
memory: 18760kb
input:
10 69720 312974804124 1 375110834 3284756 1 2 958035607 5372989 1 1 96816917 5896324 1 1 659349114 23601583 1 1 123026525 45334114 1 2 810136368 59250875 1 2 382704738 59429789 1 1 397855561 69769833 1 2 194473720 85533928 1 1 41349414 87337444 1 1 854195287 89285949 1 2 208588652 102226384 1 2 8322...
output:
192359142508 690359228247 4301019212 770771226671 59321270708 972659014596 34895107242 342872704017 43369717825 828295749790 281202583338 607302423053 105982895679 805855161263 12072175115 993484291384 114227155230 666678426833 136839246084 981181564986
result:
ok 20 numbers
Test #24:
score: 0
Accepted
time: 229ms
memory: 50728kb
input:
1 400000 862246722332 1 879284128 1644473 1 1 566310427 2602197 1 1 305759998 3635844 1 2 306032716 11995694 1 2 389513871 14509476 1 2 761692038 14593427 1 2 924522024 17673793 1 1 604735028 18750462 1 2 312343123 19169330 1 1 37783135 19583722 1 2 765576144 19935364 1 1 508498315 23251498 1 2 3123...
output:
511340089351 555367600772
result:
ok 2 number(s): "511340089351 555367600772"
Test #25:
score: 0
Accepted
time: 203ms
memory: 50488kb
input:
1 400000 601546500618 1 193617644 437488 1 1 687635851 1161220 1 1 867854270 3644275 1 2 75321946 7668994 1 2 19512874 8264014 1 2 2373384 11375302 1 2 167691473 17921764 1 1 837478720 23661825 1 1 319362132 27535622 1 2 9492126 28282384 1 2 21937131 28442718 1 1 284421469 28539626 1 1 313762592 307...
output:
212927310768 944532983806
result:
ok 2 number(s): "212927310768 944532983806"
Test #26:
score: 0
Accepted
time: 116ms
memory: 2528kb
input:
10000 59 10000000000 2 38224116 294735 0 1 791184194 294735 1 2 38224116 1963991 1 1 46743924 2052699 1 1 555377382 3945603 1 2 686459062 3952976 1 2 905596132 7512134 1 2 420873888 8587106 1 1 586803310 8596700 1 1 755231195 12584511 1 1 403524468 17231015 1 1 460174100 23414884 1 2 115239866 25206...
output:
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
result:
ok 13652 numbers
Test #27:
score: 0
Accepted
time: 130ms
memory: 2748kb
input:
1000 99 10000000000 2 307832277 78148 0 2 307832277 78148 1 1 275518058 2292869 1 2 318752188 3421425 1 1 538132005 4313972 1 2 559436916 4729882 1 2 97509167 4815124 1 2 154178279 4851744 1 2 567062651 6312029 1 2 665106524 7115329 1 2 715927148 8744720 1 1 502131755 9331956 1 2 809734156 9420053 1...
output:
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
result:
ok 1468 numbers
Test #28:
score: 0
Accepted
time: 131ms
memory: 4736kb
input:
100 10051 10000000000 2 139050006 1151 0 2 139050006 1151 1 1 500313852 6700 1 2 681995605 9186 1 1 270810606 22090 1 1 995827512 24954 1 1 53631098 30759 1 1 399843074 46446 1 2 126028509 48532 1 1 981492639 53805 1 2 702955098 123192 1 1 795346040 129998 1 2 556795597 151390 1 1 989719151 160084 1...
output:
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 182168532 694021729 -1 -1 -1 -1 577259203 783733321 -1 -1 -1 671704640 925928203 -1 -1 -1 -1 -1 138312166 436590105 -1 130000444 166930180 1796852385 5828587855 3700769434 7831971589 5341012067 6770347121 -1 924292593 5310349577 11307...
result:
ok 154 numbers
Test #29:
score: 0
Accepted
time: 167ms
memory: 20596kb
input:
10 128435 10000000000 2 650210546 297 0 2 650210546 297 1 1 614257067 1396 1 2 303092138 3047 1 1 571581225 3700 1 2 385229129 4100 1 1 445435100 4835 1 2 193655129 6197 1 2 153784571 7701 1 1 104200814 10218 1 1 60272333 10546 1 1 633189238 11303 1 1 100743505 11632 1 1 402614614 11726 1 2 6587875 ...
output:
-1 -1 -1 -1 5027602745 7828469284 809575451 2243952975 50008876934 92680594103 68404371711 98198887855 599544816032 676768101584 32564552152 866063397702
result:
ok 16 numbers
Test #30:
score: 0
Accepted
time: 198ms
memory: 50580kb
input:
1 399999 10000000000 2 233850926 90 0 1 748456332 90 1 1 213487336 626 1 1 157311336 716 1 1 28947387 765 1 1 424478786 1436 1 1 548164753 1638 1 1 431903000 1949 1 2 233850926 2028 1 2 716019297 2086 1 2 275417128 2176 1 2 289866313 2231 1 2 275427198 2822 1 2 749995741 2921 1 1 874030515 3547 1 2 ...
output:
-1
result:
ok 1 number(s): "-1"
Test #31:
score: 0
Accepted
time: 204ms
memory: 50592kb
input:
1 399999 10000000000 1 326385488 311 0 1 326385488 311 1 1 203877106 1099 1 2 644432124 1199 1 2 127852006 1290 1 2 407011871 1404 1 1 167030010 1854 1 1 704974376 2001 1 2 176461067 2510 1 2 528064718 2688 1 2 558130105 2947 1 2 472257639 3212 1 1 17497002 3607 1 1 887225470 3609 1 1 885238663 3997...
output:
47241340 63768254
result:
ok 2 number(s): "47241340 63768254"
Test #32:
score: 0
Accepted
time: 197ms
memory: 50428kb
input:
1 399999 10000000000 2 720746168 2538 0 1 389889266 2538 1 1 846649225 3346 1 2 720746168 6867 1 2 220578380 8319 1 2 478006698 14785 1 1 543403305 15269 1 1 994117268 17197 1 1 244609566 17573 1 1 186393243 18023 1 1 429534436 19900 1 1 831875453 21942 1 2 708904325 22934 1 2 674347985 25188 1 1 89...
output:
63929246 848919318
result:
ok 2 number(s): "63929246 848919318"
Test #33:
score: 0
Accepted
time: 199ms
memory: 50652kb
input:
1 399999 10000000000 1 708135129 3777 0 1 708135129 3777 1 2 378842907 12099 1 2 491334572 15760 1 2 57000817 22432 1 2 107356454 24206 1 1 355006013 25808 1 1 215578462 26957 1 1 915491561 27307 1 2 955971633 39399 1 2 609588029 44169 1 2 842497351 48865 1 1 617427596 53607 1 2 398484603 54969 1 2 ...
output:
27037798 925795917
result:
ok 2 number(s): "27037798 925795917"
Test #34:
score: 0
Accepted
time: 194ms
memory: 50528kb
input:
1 399999 10000000000 2 85635799 55054 0 2 85635799 55054 1 1 280335848 174979 1 2 939318300 209001 1 2 894465429 284645 1 2 618497444 297291 1 2 965916461 360005 1 1 974758958 400989 1 1 764253644 422154 1 2 15313245 481707 1 2 663242137 493111 1 1 798251629 520714 1 1 578532763 538498 1 2 468635252...
output:
996300115 8421496745
result:
ok 2 number(s): "996300115 8421496745"
Test #35:
score: 0
Accepted
time: 198ms
memory: 50516kb
input:
1 399999 10000000000 1 419779110 42873 0 2 809879504 42873 1 2 969885028 63945 1 1 419779110 78559 1 2 833465970 114507 1 1 575954552 137275 1 2 845350982 144299 1 1 829415866 177492 1 2 377975311 191331 1 2 543827092 388125 1 2 954840061 429840 1 1 234193563 430657 1 2 814992278 519061 1 2 13492113...
output:
3348662196 5187741015
result:
ok 2 number(s): "3348662196 5187741015"
Test #36:
score: 0
Accepted
time: 219ms
memory: 50484kb
input:
1 399999 10000000000 2 53438133 376125 0 2 53438133 376125 1 2 987743109 395850 1 1 166707936 441017 1 2 740702438 626572 1 2 254475979 650308 1 2 327881470 975326 1 1 519757004 1146648 1 1 745882219 1449930 1 1 704933732 1504462 1 1 567410879 1660559 1 1 501447393 2155145 1 1 217253545 2205303 1 2 ...
output:
75248596220 96080897908
result:
ok 2 number(s): "75248596220 96080897908"
Test #37:
score: 0
Accepted
time: 190ms
memory: 50496kb
input:
1 399999 10000000000 1 490359113 409073 0 2 635603234 409073 1 1 490359113 582604 1 1 466100352 1806496 1 1 851462909 2072668 1 2 835324462 2096985 1 1 306968106 2569687 1 2 843905600 2624494 1 1 421262349 2841982 1 2 566061630 3227185 1 1 840367098 3398146 1 1 755106699 3440275 1 1 893965367 398535...
output:
-1
result:
ok 1 number(s): "-1"
Test #38:
score: 0
Accepted
time: 214ms
memory: 50748kb
input:
1 399999 10000000000 2 108713408 355367 0 1 495440048 355367 1 2 108713408 5246476 1 1 829460048 18527254 1 2 643329162 19258328 1 2 889222716 22102287 1 2 408057726 26361813 1 2 793626956 26469500 1 2 138076520 29441704 1 1 91238764 31551010 1 2 871893174 31820730 1 1 668770819 34779933 1 1 8155239...
output:
326517728008 374248053587
result:
ok 2 number(s): "326517728008 374248053587"
Test #39:
score: 0
Accepted
time: 205ms
memory: 50444kb
input:
1 399999 10000000000 1 107735064 1466866 0 2 435376868 1466866 1 1 107735064 4168250 1 1 514024463 6140405 1 2 743983631 11245466 1 1 806314530 15082970 1 1 785572414 15407736 1 1 210419929 17442417 1 2 614548459 17450482 1 1 82717421 17736378 1 2 747895352 19709129 1 2 512995307 20474608 1 1 917777...
output:
24033093497 889551871011
result:
ok 2 number(s): "24033093497 889551871011"
Extra Test:
score: 0
Extra Test Passed