QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#853309#9733. Heavy-light Decompositionucup-team296#AC ✓23ms15700kbRust39.0kb2025-01-11 16:32:432025-01-11 16:32:51

Judging History

你现在查看的是最新测评结果

  • [2025-01-11 16:32:51]
  • 评测
  • 测评结果:AC
  • 用时:23ms
  • 内存:15700kb
  • [2025-01-11 16:32:43]
  • 提交

answer

// https://contest.ucup.ac/contest/1893/problem/9733
use crate::algo_lib::collections::min_max::MinimMaxim;
use crate::algo_lib::collections::vec_ext::inc_dec::IncDec;
use crate::algo_lib::graph::edges::edge::Edge;
use crate::algo_lib::graph::edges::edge_trait::EdgeTrait;
use crate::algo_lib::graph::Graph;
use crate::algo_lib::io::input::Input;
use crate::algo_lib::io::output::Output;
use crate::algo_lib::misc::recursive_function::{Callable, RecursiveFunction};
use crate::algo_lib::misc::test_type::TaskType;
use crate::algo_lib::misc::test_type::TestType;
use std::cmp::Reverse;
type PreCalc = ();
fn solve(input: &mut Input, out: &mut Output, _test_case: usize, _data: &mut PreCalc) {
    let n = input.read_size();
    let k = input.read_size();
    let mut chains = input.read_size_pair_vec(k).dec();
    chains.sort_unstable_by_key(|&(x, y)| Reverse(y - x));
    let mut ans = vec![0; n];
    let mut heavy = vec![n; n];
    let base = chains[0].0;
    let base_len = chains[0].1 - chains[0].0 + 1;
    let mut graph = Graph::new(n);
    for (x, y) in chains {
        let cur_len = y - x + 1;
        if x != base {
            let par = (base + base_len - cur_len).max(base + 1);
            ans[x] = par;
            graph.add_edge(Edge::new(par - 1, x));
        }
        for i in x + 1..=y {
            ans[i] = i;
            heavy[i - 1] = i;
            graph.add_edge(Edge::new(i - 1, i));
        }
    }
    let mut size = vec![0; n];
    let mut ok = true;
    let mut dfs = RecursiveFunction::new(|dfs, vert: usize| {
        size[vert] = 1;
        let mut max = 0;
        for e in &graph[vert] {
            let call = dfs.call(e.to());
            max.maxim(call);
            size[vert] += call;
        }
        if heavy[vert] != n && size[heavy[vert]] < max || heavy[vert] == n && max > 0 {
            ok = false;
        }
        size[vert]
    });
    dfs.call(base);
    if !ok {
        out.print_line("IMPOSSIBLE");
        return;
    }
    out.print_line(ans);
}
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,
    }
}


fn main() {
    let mut sin = std::io::stdin();
    let input = crate::algo_lib::io::input::Input::new(&mut sin);
    let mut stdout = std::io::stdout();
    let output = crate::algo_lib::io::output::Output::new(&mut stdout);
    run(input, output);
}
pub mod algo_lib {
pub mod collections {
pub mod dsu {
use crate::algo_lib::collections::slice_ext::bounds::Bounds;
use crate::algo_lib::collections::slice_ext::indices::Indices;
use std::cell::Cell;
#[derive(Clone)]
pub struct DSU {
    id: Vec<Cell<i32>>,
    count: usize,
}
impl DSU {
    pub fn new(n: usize) -> Self {
        Self {
            id: vec![Cell::new(- 1); n],
            count: n,
        }
    }
    pub fn size(&self, i: usize) -> usize {
        (-self.id[self.find(i)].get()) as usize
    }
    #[allow(clippy::len_without_is_empty)]
    pub fn len(&self) -> usize {
        self.id.len()
    }
    pub fn iter(&self) -> impl Iterator<Item = usize> + '_ {
        self.id
            .iter()
            .enumerate()
            .filter_map(|(i, id)| if id.get() < 0 { Some(i) } else { None })
    }
    pub fn set_count(&self) -> usize {
        self.count
    }
    pub fn union(&mut self, mut a: usize, mut b: usize) -> bool {
        a = self.find(a);
        b = self.find(b);
        if a == b {
            false
        } else {
            self.id[a].set(self.id[a].get() + self.id[b].get());
            self.id[b].set(a as i32);
            self.count -= 1;
            true
        }
    }
    pub fn find(&self, i: usize) -> usize {
        if self.id[i].get() >= 0 {
            let res = self.find(self.id[i].get() as usize);
            self.id[i].set(res as i32);
            res
        } else {
            i
        }
    }
    pub fn clear(&mut self) {
        self.count = self.id.len();
        self.id.fill(Cell::new(-1));
    }
    pub fn parts(&self) -> Vec<Vec<usize>> {
        let roots: Vec<_> = self.iter().collect();
        let mut res = vec![Vec::new(); roots.len()];
        for i in self.id.indices() {
            res[roots.as_slice().bin_search(&self.find(i)).unwrap()].push(i);
        }
        res
    }
}
}
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 slice_ext {
pub mod bounds {
use std::ops::{Bound, RangeBounds};
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 {
        self.lower_bound(el)
    }
    fn less_or_eq(&self, el: &T) -> usize {
        self.upper_bound(el)
    }
    fn inside<'a>(&self, bounds: impl RangeBounds<&'a T>) -> usize
    where
        T: 'a;
}
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 inside<'a>(&self, bounds: impl RangeBounds<&'a T>) -> usize
    where
        T: 'a,
    {
        let to = match bounds.end_bound() {
            Bound::Included(el) => self.less_or_eq(el),
            Bound::Excluded(el) => self.less(el),
            Bound::Unbounded => self.len(),
        };
        let from = match bounds.start_bound() {
            Bound::Included(el) => self.less(el),
            Bound::Excluded(el) => self.less_or_eq(el),
            Bound::Unbounded => 0,
        };
        to - from
    }
}
}
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 inc_dec {
use crate::algo_lib::numbers::num_traits::algebra::{AdditionMonoidWithSub, One};
pub trait IncDec {
    #[must_use]
    fn inc(self) -> Self;
    #[must_use]
    fn dec(self) -> Self;
}
impl<T: AdditionMonoidWithSub + One> IncDec for T {
    fn inc(self) -> Self {
        self + T::one()
    }
    fn dec(self) -> Self {
        self - T::one()
    }
}
impl<T: AdditionMonoidWithSub + One> IncDec for Vec<T> {
    fn inc(mut self) -> Self {
        self.iter_mut().for_each(|i| *i += T::one());
        self
    }
    fn dec(mut self) -> Self {
        self.iter_mut().for_each(|i| *i -= T::one());
        self
    }
}
impl<T: AdditionMonoidWithSub + One> IncDec for Vec<Vec<T>> {
    fn inc(mut self) -> Self {
        self.iter_mut().for_each(|v| v.iter_mut().for_each(|i| *i += T::one()));
        self
    }
    fn dec(mut self) -> Self {
        self.iter_mut().for_each(|v| v.iter_mut().for_each(|i| *i -= T::one()));
        self
    }
}
impl<T: AdditionMonoidWithSub + One, U: AdditionMonoidWithSub + One> IncDec
for Vec<(T, U)> {
    fn inc(mut self) -> Self {
        self.iter_mut()
            .for_each(|(i, j)| {
                *i += T::one();
                *j += U::one();
            });
        self
    }
    fn dec(mut self) -> Self {
        self.iter_mut()
            .for_each(|(i, j)| {
                *i -= T::one();
                *j -= U::one();
            });
        self
    }
}
impl<T: AdditionMonoidWithSub + One, U: AdditionMonoidWithSub + One, V> IncDec
for Vec<(T, U, V)> {
    fn inc(mut self) -> Self {
        self.iter_mut()
            .for_each(|(i, j, _)| {
                *i += T::one();
                *j += U::one();
            });
        self
    }
    fn dec(mut self) -> Self {
        self.iter_mut()
            .for_each(|(i, j, _)| {
                *i -= T::one();
                *j -= U::one();
            });
        self
    }
}
impl<T: AdditionMonoidWithSub + One, U: AdditionMonoidWithSub + One, V, W> IncDec
for Vec<(T, U, V, W)> {
    fn inc(mut self) -> Self {
        self.iter_mut()
            .for_each(|(i, j, ..)| {
                *i += T::one();
                *j += U::one();
            });
        self
    }
    fn dec(mut self) -> Self {
        self.iter_mut()
            .for_each(|(i, j, ..)| {
                *i -= T::one();
                *j -= U::one();
            });
        self
    }
}
impl<T: AdditionMonoidWithSub + One, U: AdditionMonoidWithSub + One, V, W, X> IncDec
for Vec<(T, U, V, W, X)> {
    fn inc(mut self) -> Self {
        self.iter_mut()
            .for_each(|(i, j, ..)| {
                *i += T::one();
                *j += U::one();
            });
        self
    }
    fn dec(mut self) -> Self {
        self.iter_mut()
            .for_each(|(i, j, ..)| {
                *i -= T::one();
                *j -= U::one();
            });
        self
    }
}
impl<T: AdditionMonoidWithSub + One, U: AdditionMonoidWithSub + One> IncDec for (T, U) {
    fn inc(mut self) -> Self {
        self.0 += T::one();
        self.1 += U::one();
        self
    }
    fn dec(mut self) -> Self {
        self.0 -= T::one();
        self.1 -= U::one();
        self
    }
}
}
}
}
pub mod graph {
use crate::algo_lib::collections::dsu::DSU;
use crate::algo_lib::graph::edges::bi_edge::BiEdge;
use crate::algo_lib::graph::edges::edge::Edge;
use crate::algo_lib::graph::edges::edge_trait::{BidirectionalEdgeTrait, EdgeTrait};
use std::ops::{Index, IndexMut};



















#[derive(Clone)]
pub struct Graph<E: EdgeTrait> {
    edges: Vec<Vec<E>>,
    edge_count: usize,
}
impl<E: EdgeTrait> Graph<E> {
    pub fn new(vertex_count: usize) -> Self {
        Self {
            edges: vec![Vec::new(); vertex_count],
            edge_count: 0,
        }
    }
    pub fn add_edge(&mut self, (from, mut edge): (usize, E)) -> usize {
        let to = edge.to();
        assert!(to < self.vertex_count());
        let direct_id = self.edges[from].len();
        edge.set_id(self.edge_count);
        self.edges[from].push(edge);
        if E::REVERSABLE {
            let rev_id = self.edges[to].len();
            self.edges[from][direct_id].set_reverse_id(rev_id);
            let mut rev_edge = self.edges[from][direct_id].reverse_edge(from);
            rev_edge.set_id(self.edge_count);
            rev_edge.set_reverse_id(direct_id);
            self.edges[to].push(rev_edge);
        }
        self.edge_count += 1;
        direct_id
    }
    pub fn add_vertices(&mut self, cnt: usize) {
        self.edges.resize(self.edges.len() + cnt, Vec::new());
    }
    pub fn clear(&mut self) {
        self.edge_count = 0;
        for ve in self.edges.iter_mut() {
            ve.clear();
        }
    }
    pub fn vertex_count(&self) -> usize {
        self.edges.len()
    }
    pub fn edge_count(&self) -> usize {
        self.edge_count
    }
    pub fn degrees(&self) -> Vec<usize> {
        self.edges.iter().map(|v| v.len()).collect()
    }
}
impl<E: BidirectionalEdgeTrait> Graph<E> {
    pub fn is_tree(&self) -> bool {
        if self.edge_count + 1 != self.vertex_count() {
            false
        } else {
            self.is_connected()
        }
    }
    pub fn is_forest(&self) -> bool {
        let mut dsu = DSU::new(self.vertex_count());
        for i in 0..self.vertex_count() {
            for e in self[i].iter() {
                if i <= e.to() && !dsu.union(i, e.to()) {
                    return false;
                }
            }
        }
        true
    }
    pub fn is_connected(&self) -> bool {
        let mut dsu = DSU::new(self.vertex_count());
        for i in 0..self.vertex_count() {
            for e in self[i].iter() {
                dsu.union(i, e.to());
            }
        }
        dsu.set_count() == 1
    }
}
impl<E: EdgeTrait> Index<usize> for Graph<E> {
    type Output = [E];
    fn index(&self, index: usize) -> &Self::Output {
        &self.edges[index]
    }
}
impl<E: EdgeTrait> IndexMut<usize> for Graph<E> {
    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
        &mut self.edges[index]
    }
}
impl Graph<Edge<()>> {
    pub fn from_edges(n: usize, edges: &[(usize, usize)]) -> Self {
        let mut graph = Self::new(n);
        for &(from, to) in edges {
            graph.add_edge(Edge::new(from, to));
        }
        graph
    }
}
impl<P: Clone> Graph<Edge<P>> {
    pub fn from_edges_with_payload(n: usize, edges: &[(usize, usize, P)]) -> Self {
        let mut graph = Self::new(n);
        for (from, to, p) in edges.iter() {
            graph.add_edge(Edge::with_payload(*from, *to, p.clone()));
        }
        graph
    }
}
impl Graph<BiEdge<()>> {
    pub fn from_biedges(n: usize, edges: &[(usize, usize)]) -> Self {
        let mut graph = Self::new(n);
        for &(from, to) in edges {
            graph.add_edge(BiEdge::new(from, to));
        }
        graph
    }
}
impl<P: Clone> Graph<BiEdge<P>> {
    pub fn from_biedges_with_payload(n: usize, edges: &[(usize, usize, P)]) -> Self {
        let mut graph = Self::new(n);
        for (from, to, p) in edges.iter() {
            graph.add_edge(BiEdge::with_payload(*from, *to, p.clone()));
        }
        graph
    }
}
pub mod edges {
pub mod bi_edge {
use crate::algo_lib::graph::edges::bi_edge_trait::BiEdgeTrait;
use crate::algo_lib::graph::edges::edge_id::{EdgeId, NoId, WithId};
use crate::algo_lib::graph::edges::edge_trait::{BidirectionalEdgeTrait, EdgeTrait};
#[derive(Clone)]
pub struct BiEdgeRaw<Id: EdgeId, P> {
    to: u32,
    id: Id,
    payload: P,
}
impl<Id: EdgeId> BiEdgeRaw<Id, ()> {
    pub fn new(from: usize, to: usize) -> (usize, Self) {
        (
            from,
            Self {
                to: to as u32,
                id: Id::new(),
                payload: (),
            },
        )
    }
}
impl<Id: EdgeId, P> BiEdgeRaw<Id, P> {
    pub fn with_payload(from: usize, to: usize, payload: P) -> (usize, Self) {
        (from, Self::with_payload_impl(to, payload))
    }
    fn with_payload_impl(to: usize, payload: P) -> BiEdgeRaw<Id, P> {
        Self {
            to: to as u32,
            id: Id::new(),
            payload,
        }
    }
}
impl<Id: EdgeId, P: Clone> BidirectionalEdgeTrait for BiEdgeRaw<Id, P> {}
impl<Id: EdgeId, P: Clone> EdgeTrait for BiEdgeRaw<Id, P> {
    type Payload = P;
    const REVERSABLE: bool = true;
    fn to(&self) -> usize {
        self.to as usize
    }
    fn id(&self) -> usize {
        self.id.id()
    }
    fn set_id(&mut self, id: usize) {
        self.id.set_id(id);
    }
    fn reverse_id(&self) -> usize {
        panic!("no reverse id")
    }
    fn set_reverse_id(&mut self, _: usize) {}
    fn reverse_edge(&self, from: usize) -> Self {
        Self::with_payload_impl(from, self.payload.clone())
    }
    fn payload(&self) -> &P {
        &self.payload
    }
}
impl<Id: EdgeId, P: Clone> BiEdgeTrait for BiEdgeRaw<Id, P> {}
pub type BiEdge<P> = BiEdgeRaw<NoId, P>;
pub type BiEdgeWithId<P> = BiEdgeRaw<WithId, P>;
}
pub mod bi_edge_trait {
use crate::algo_lib::graph::edges::edge_trait::EdgeTrait;
pub trait BiEdgeTrait: EdgeTrait {}
}
pub mod edge {
use crate::algo_lib::graph::edges::edge_id::{EdgeId, NoId, WithId};
use crate::algo_lib::graph::edges::edge_trait::EdgeTrait;
#[derive(Clone)]
pub struct EdgeRaw<Id: EdgeId, P> {
    to: u32,
    id: Id,
    payload: P,
}
impl<Id: EdgeId> EdgeRaw<Id, ()> {
    pub fn new(from: usize, to: usize) -> (usize, Self) {
        (
            from,
            Self {
                to: to as u32,
                id: Id::new(),
                payload: (),
            },
        )
    }
}
impl<Id: EdgeId, P> EdgeRaw<Id, P> {
    pub fn with_payload(from: usize, to: usize, payload: P) -> (usize, Self) {
        (from, Self::with_payload_impl(to, payload))
    }
    fn with_payload_impl(to: usize, payload: P) -> Self {
        Self {
            to: to as u32,
            id: Id::new(),
            payload,
        }
    }
}
impl<Id: EdgeId, P: Clone> EdgeTrait for EdgeRaw<Id, P> {
    type Payload = P;
    const REVERSABLE: bool = false;
    fn to(&self) -> usize {
        self.to as usize
    }
    fn id(&self) -> usize {
        self.id.id()
    }
    fn set_id(&mut self, id: usize) {
        self.id.set_id(id);
    }
    fn reverse_id(&self) -> usize {
        panic!("no reverse")
    }
    fn set_reverse_id(&mut self, _: usize) {
        panic!("no reverse")
    }
    fn reverse_edge(&self, _: usize) -> Self {
        panic!("no reverse")
    }
    fn payload(&self) -> &P {
        &self.payload
    }
}
pub type Edge<P> = EdgeRaw<NoId, P>;
pub type EdgeWithId<P> = EdgeRaw<WithId, P>;
}
pub mod edge_id {
pub trait EdgeId: Clone {
    fn new() -> Self;
    fn id(&self) -> usize;
    fn set_id(&mut self, id: usize);
}
#[derive(Clone)]
pub struct WithId {
    id: u32,
}
impl EdgeId for WithId {
    fn new() -> Self {
        Self { id: 0 }
    }
    fn id(&self) -> usize {
        self.id as usize
    }
    fn set_id(&mut self, id: usize) {
        self.id = id as u32;
    }
}
#[derive(Clone)]
pub struct NoId {}
impl EdgeId for NoId {
    fn new() -> Self {
        Self {}
    }
    fn id(&self) -> usize {
        panic!("Id called on no id")
    }
    fn set_id(&mut self, _: usize) {}
}
}
pub mod edge_trait {
pub trait EdgeTrait: Clone {
    type Payload;
    const REVERSABLE: bool;
    fn to(&self) -> usize;
    fn id(&self) -> usize;
    fn set_id(&mut self, id: usize);
    fn reverse_id(&self) -> usize;
    fn set_reverse_id(&mut self, reverse_id: usize);
    #[must_use]
    fn reverse_edge(&self, from: usize) -> Self;
    fn payload(&self) -> &Self::Payload;
}
pub trait BidirectionalEdgeTrait: EdgeTrait {}
}
}
}
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,
    eol: bool,
}
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,
            eol: true,
        }
    }
    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,
            eol: true,
        }
    }
    pub fn get(&mut self) -> Option<u8> {
        if self.refill_buffer() {
            let res = self.buf[self.at];
            self.at += 1;
            if res == b'\r' {
                self.eol = true;
                if self.refill_buffer() && self.buf[self.at] == b'\n' {
                    self.at += 1;
                }
                return Some(b'\n');
            }
            self.eol = res == 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) }
    }
    pub fn is_exhausted(&mut self) -> bool {
        self.peek().is_none()
    }
    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 fn is_eol(&self) -> bool {
        self.eol
    }
}
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
}
}
pub mod output {
use crate::algo_lib::collections::vec_ext::default::default_vec;
use std::cmp::Reverse;
use std::io::{stderr, Stderr, 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>,
    separator: u8,
}
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,
            separator: b' ',
        }
    }
    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,
            separator: b' ',
        }
    }
    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(self.separator);
            }
            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
    }
    pub fn separator(&self) -> u8 {
        self.separator
    }
    pub fn set_separator(&mut self, separator: u8) {
        self.separator = separator;
    }
}
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(out
        .separator); 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 recursive_function {
use std::marker::PhantomData;
macro_rules! recursive_function {
    ($name:ident, $trait:ident, ($($type:ident $arg:ident,)*)) => {
        pub trait $trait <$($type,)* Output > { fn call(& mut self, $($arg : $type,)*) ->
        Output; } pub struct $name < F, $($type,)* Output > where F : FnMut(& mut dyn
        $trait <$($type,)* Output >, $($type,)*) -> Output, { f : std::cell::UnsafeCell <
        F >, $($arg : PhantomData <$type >,)* phantom_output : PhantomData < Output >, }
        impl < F, $($type,)* Output > $name < F, $($type,)* Output > where F : FnMut(&
        mut dyn $trait <$($type,)* Output >, $($type,)*) -> Output, { pub fn new(f : F)
        -> Self { Self { f : std::cell::UnsafeCell::new(f), $($arg :
        Default::default(),)* phantom_output : Default::default(), } } } impl < F,
        $($type,)* Output > $trait <$($type,)* Output > for $name < F, $($type,)* Output
        > where F : FnMut(& mut dyn $trait <$($type,)* Output >, $($type,)*) -> Output, {
        fn call(& mut self, $($arg : $type,)*) -> Output { unsafe { (* self.f.get())
        (self, $($arg,)*) } } }
    };
}
recursive_function!(RecursiveFunction0, Callable0, ());
recursive_function!(RecursiveFunction, Callable, (Arg arg,));
recursive_function!(RecursiveFunction2, Callable2, (Arg1 arg1, Arg2 arg2,));
recursive_function!(RecursiveFunction3, Callable3, (Arg1 arg1, Arg2 arg2, Arg3 arg3,));
recursive_function!(
    RecursiveFunction4, Callable4, (Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4,)
);
recursive_function!(
    RecursiveFunction5, Callable5, (Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5
    arg5,)
);
recursive_function!(
    RecursiveFunction6, Callable6, (Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5
    arg5, Arg6 arg6,)
);
recursive_function!(
    RecursiveFunction7, Callable7, (Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5
    arg5, Arg6 arg6, Arg7 arg7,)
);
recursive_function!(
    RecursiveFunction8, Callable8, (Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5
    arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8,)
);
recursive_function!(
    RecursiveFunction9, Callable9, (Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5
    arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9,)
);
}
pub mod test_type {
pub enum TestType {
    Single,
    MultiNumber,
    MultiEof,
}
pub enum TaskType {
    Classic,
    Interactive,
}
}
}
pub mod numbers {
pub mod num_traits {
pub mod algebra {
use crate::algo_lib::numbers::num_traits::invertible::Invertible;
use std::ops::{
    Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Rem, RemAssign, Sub, 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 invertible {
pub trait Invertible {
    type Output;
    fn inv(&self) -> Option<Self::Output>;
}
}
}
}
}

这程序好像有点Bug,我给组数据试试?

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 2232kb

input:

3
12 5
1 5
9 11
7 8
6 6
12 12
4 3
1 1
4 4
2 3
2 2
1 1
2 2

output:

0 1 2 3 4 4 3 7 2 9 10 4
2 0 2 2
IMPOSSIBLE

result:

ok Correct. (3 test cases)

Test #2:

score: 0
Accepted
time: 11ms
memory: 15700kb

input:

10
1 1
1 1
100000 1
1 100000
12 4
1 3
4 6
7 9
10 12
6 3
4 6
2 3
1 1
8999 3
1 3000
3001 6000
6001 8999
14 4
1 3
4 6
7 10
11 14
17 5
1 3
4 6
7 10
11 14
15 17
19999 2
1 9999
10000 19999
1 1
1 1
5 3
1 1
2 3
4 5

output:

0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 ...

result:

ok Correct. (10 test cases)

Test #3:

score: 0
Accepted
time: 9ms
memory: 6356kb

input:

5
11 5
1 3
4 6
7 8
9 10
11 11
39998 4
1 10000
10001 20000
20001 30000
30001 39998
49000 5
1 10000
39999 49000
10001 20000
20001 30000
30001 39998
16 5
1 1
2 3
4 6
7 11
12 16
10 5
1 2
3 4
5 6
7 8
9 10

output:

0 1 2 1 4 5 1 7 1 9 2
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 ...

result:

ok Correct. (5 test cases)

Test #4:

score: 0
Accepted
time: 12ms
memory: 2112kb

input:

10000
20 6
17 20
7 9
1 3
4 6
10 12
13 16
20 12
7 7
4 4
10 10
8 8
3 3
1 1
6 6
2 2
5 5
11 11
12 20
9 9
20 16
11 11
5 6
9 9
2 2
12 12
1 1
18 20
8 8
15 15
13 13
16 17
10 10
14 14
3 3
4 4
7 7
20 16
6 7
10 10
13 13
18 18
19 19
14 14
1 1
20 20
8 8
4 5
9 9
2 3
12 12
11 11
16 17
15 15
20 5
1 1
6 6
7 12
13 20...

output:

IMPOSSIBLE
19 19 19 19 19 19 19 19 19 19 19 0 12 13 14 15 16 17 18 19
19 19 19 19 18 5 19 19 19 19 19 19 19 19 19 18 16 0 18 19
IMPOSSIBLE
19 16 2 3 4 19 14 7 8 9 10 11 0 13 14 15 16 17 18 19
IMPOSSIBLE
19 13 2 3 4 5 6 7 0 9 10 11 12 13 14 15 16 17 18 19
16 1 2 3 16 5 6 7 19 0 10 11 12 13 14 15 16 1...

result:

ok Correct. (10000 test cases)

Test #5:

score: 0
Accepted
time: 17ms
memory: 2176kb

input:

20000
13 12
12 12
7 7
1 1
5 5
9 9
8 8
13 13
4 4
3 3
6 6
10 11
2 2
16 8
4 4
5 5
1 1
6 6
7 7
3 3
8 16
2 2
20 17
19 19
1 1
17 18
14 14
4 4
13 13
7 7
5 5
11 11
15 15
16 16
20 20
12 12
9 10
8 8
2 3
6 6
17 9
3 4
2 2
9 10
7 8
5 6
11 12
1 1
15 17
13 14
6 2
2 6
1 1
1 1
1 1
10 2
5 10
1 4
17 17
3 3
12 12
15 15...

output:

10 10 10 10 10 10 10 10 10 0 10 10 10
15 15 15 15 15 15 15 0 8 9 10 11 12 13 14 15
IMPOSSIBLE
16 16 15 3 15 5 15 7 15 9 15 11 15 13 0 15 16
5 0 2 3 4 5
0
6 1 2 3 0 5 6 7 8 9
IMPOSSIBLE
0 1 2 3 4 5 6 7 8 9 10 11 12 13
IMPOSSIBLE
IMPOSSIBLE
15 15 15 15 0 5 6 7 8 9 10 11 12 13 14 15
0 1
IMPOSSIBLE
IMPO...

result:

ok Correct. (20000 test cases)

Test #6:

score: 0
Accepted
time: 15ms
memory: 2124kb

input:

50000
1 1
1 1
4 3
1 1
4 4
2 3
9 9
1 1
5 5
8 8
9 9
7 7
2 2
3 3
6 6
4 4
4 2
1 2
3 4
2 2
1 1
2 2
1 1
1 1
10 2
1 7
8 10
8 8
4 4
5 5
6 6
8 8
3 3
1 1
2 2
7 7
7 7
7 7
4 4
5 5
2 2
3 3
1 1
6 6
10 2
8 10
1 7
8 1
1 8
2 1
1 2
9 4
1 2
5 6
7 9
3 4
7 1
1 7
7 2
1 1
2 7
4 2
1 1
2 4
6 3
3 6
1 1
2 2
3 3
3 3
1 1
2 2
1 ...

output:

0
2 0 2 2
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
0
0 1 2 3 4 5 6 4 8 9
IMPOSSIBLE
IMPOSSIBLE
0 1 2 3 4 5 6 4 8 9
0 1 2 3 4 5 6 7
0 1
7 1 7 3 7 5 0 7 8
0 1 2 3 4 5 6
6 0 2 3 4 5 6
3 0 2 3
5 5 0 3 4 5
IMPOSSIBLE
0
3 3 0 3
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
0 1
IMPOSSIBLE
0 1 1 1
3 3 0 3 3
IMPOSSIBL...

result:

ok Correct. (50000 test cases)

Test #7:

score: 0
Accepted
time: 10ms
memory: 3244kb

input:

100
2619 693
286 286
81 81
552 552
397 397
24 24
414 414
378 378
660 660
538 538
125 125
190 190
585 585
180 180
564 564
218 218
158 158
425 425
189 189
94 94
29 29
678 678
543 543
352 352
659 659
467 467
403 403
298 298
517 517
196 196
156 156
278 278
259 259
417 417
499 499
246 246
195 195
380 380...

output:

2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 2618 ...

result:

ok Correct. (100 test cases)

Test #8:

score: 0
Accepted
time: 19ms
memory: 8444kb

input:

100
53984 965
9577 9632
53593 53648
17305 17360
40321 40376
37465 37520
45753 45808
52921 52976
21281 21336
44241 44296
17921 17976
40545 40600
7897 7952
9689 9744
32089 32144
43345 43400
46817 46872
4817 4872
24585 24640
41889 41944
36065 36120
3585 3640
1486 1540
29793 29848
8065 8120
43401 43456
...

output:

IMPOSSIBLE
IMPOSSIBLE
35758 1 2 3 4 5 35763 35762 8 35759 10 11 12 13 35763 35763 35763 35762 18 35763 35763 35762 22 35763 35763 35763 35763 35763 35761 29 30 35762 32 35763 35761 35 36 35763 35754 39 40 41 42 43 44 45 46 47 35762 49 35763 35763 35763 35760 54 55 56 35761 58 59 35763 35760 62 63 64...

result:

ok Correct. (100 test cases)

Test #9:

score: 0
Accepted
time: 23ms
memory: 8864kb

input:

2
100000 72281
52926 52926
1645 1646
33266 33266
88480 88480
16983 16983
29975 29977
32528 32528
89186 89186
5810 5810
90512 90512
8859 8859
22671 22671
51648 51649
26506 26506
99017 99018
64526 64526
61453 61454
73914 73914
27338 27339
43510 43510
22298 22300
59714 59714
64394 64395
71955 71956
481...

output:

25155 25153 2 3 25155 25155 25154 7 25155 25153 10 11 25155 25155 25155 25154 16 25152 18 19 20 25155 25153 23 24 25154 26 25155 25155 25155 25155 25155 25155 25155 25155 25154 36 25153 38 39 25155 25155 25155 25155 25154 45 25154 47 25153 49 50 25155 25155 25155 25155 25155 25155 25155 25155 25154 ...

result:

ok Correct. (2 test cases)

Test #10:

score: 0
Accepted
time: 21ms
memory: 2356kb

input:

100000
2 1
1 2
2 1
1 2
2 2
2 2
1 1
2 2
2 2
1 1
2 2
1 1
2 2
2 2
2 2
1 1
2 2
1 1
2 2
2 2
1 1
2 2
2 2
1 1
2 2
2 2
2 2
1 1
2 2
2 2
1 1
2 2
1 1
2 2
2 2
1 1
2 2
2 2
2 2
1 1
2 1
1 2
2 2
2 2
1 1
2 2
2 2
1 1
2 2
2 2
1 1
2 1
1 2
2 2
1 1
2 2
2 2
1 1
2 2
2 1
1 2
2 2
2 2
1 1
2 2
2 2
1 1
2 2
1 1
2 2
2 1
1 2
2 2
1...

output:

0 1
0 1
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
0 1
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
0 1
IMPOSSIBLE
IMPOSSIBLE
0 1
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
0 1
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
0...

result:

ok Correct. (100000 test cases)

Test #11:

score: 0
Accepted
time: 16ms
memory: 2180kb

input:

100000
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
...

result:

ok Correct. (100000 test cases)

Test #12:

score: 0
Accepted
time: 23ms
memory: 2240kb

input:

100000
2 1
1 2
3 1
1 3
5 2
1 1
2 5
4 4
2 2
4 4
3 3
1 1
3 3
1 1
3 3
2 2
5 1
1 5
1 1
1 1
3 2
1 1
2 3
5 5
5 5
2 2
3 3
4 4
1 1
3 3
3 3
1 1
2 2
5 4
3 4
1 1
2 2
5 5
4 3
2 2
1 1
3 4
1 1
1 1
4 1
1 4
5 4
3 4
2 2
1 1
5 5
3 1
1 3
3 3
1 1
3 3
2 2
5 1
1 5
1 1
1 1
2 2
2 2
1 1
5 1
1 5
1 1
1 1
2 2
2 2
1 1
4 2
4 4
1...

output:

0 1
0 1 2
4 0 2 3 4
IMPOSSIBLE
IMPOSSIBLE
0 1 2 3 4
0
2 0 2
IMPOSSIBLE
IMPOSSIBLE
3 3 0 3 3
3 3 0 3
0
0 1 2 3
3 3 0 3 3
0 1 2
IMPOSSIBLE
0 1 2 3 4
0
IMPOSSIBLE
0 1 2 3 4
0
IMPOSSIBLE
0 1 2 2
4 4 0 3 4
0 1 1
IMPOSSIBLE
IMPOSSIBLE
0
3 1 0 3 4
0
IMPOSSIBLE
4 4 0 3 4
0 1 2
3 3 0 3
0
0
IMPOSSIBLE
0 1 2 1...

result:

ok Correct. (100000 test cases)

Test #13:

score: 0
Accepted
time: 16ms
memory: 2332kb

input:

5000
50 26
5 6
9 10
1 1
23 24
43 44
19 20
29 30
2 2
17 18
47 48
3 4
35 36
27 28
25 26
49 50
31 32
45 46
15 16
39 40
21 22
11 12
13 14
37 38
33 34
7 8
41 42
86 12
17 20
33 36
41 86
1 3
4 6
13 16
25 28
37 40
29 32
21 24
7 9
10 12
59 35
5 5
6 6
22 22
31 31
32 32
25 25
21 21
20 20
26 26
2 2
34 34
3 3
35...

output:

IMPOSSIBLE
83 1 2 83 4 5 83 7 8 83 10 11 82 13 14 15 82 17 18 19 82 21 22 23 82 25 26 27 82 29 30 31 82 33 34 35 82 37 38 39 0 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
58 58 58 58 58 58 58 58 58 58 58 58 58...

result:

ok Correct. (5000 test cases)

Test #14:

score: 0
Accepted
time: 13ms
memory: 2540kb

input:

5000
335 22
13 18
134 140
85 91
50 56
7 12
31 36
113 119
71 77
106 112
1 6
37 42
64 70
92 98
43 49
120 126
127 133
99 105
25 30
141 335
19 24
57 63
78 84
475 21
40 42
22 24
37 39
16 18
7 9
31 33
49 51
43 45
52 54
19 21
1 2
55 57
10 12
5 6
58 475
28 30
13 15
25 27
34 36
3 4
46 48
252 159
138 138
77 7...

output:

329 1 2 3 4 5 329 7 8 9 10 11 329 13 14 15 16 17 329 19 20 21 22 23 329 25 26 27 28 29 329 31 32 33 34 35 329 37 38 39 40 41 328 43 44 45 46 47 48 328 50 51 52 53 54 55 328 57 58 59 60 61 62 328 64 65 66 67 68 69 328 71 72 73 74 75 76 328 78 79 80 81 82 83 328 85 86 87 88 89 90 328 92 93 94 95 96 97...

result:

ok Correct. (5000 test cases)

Test #15:

score: 0
Accepted
time: 11ms
memory: 2408kb

input:

1000
89 19
17 18
7 8
11 12
1 1
27 28
35 89
13 14
15 16
25 26
9 10
31 32
3 4
33 34
29 30
19 20
23 24
5 6
21 22
2 2
962 187
886 890
361 365
376 380
766 770
901 905
181 185
626 630
921 925
86 90
416 420
281 285
506 510
171 175
41 45
776 780
441 445
491 495
341 345
631 635
141 145
356 360
891 895
231 23...

output:

88 88 87 3 87 5 87 7 87 9 87 11 87 13 87 15 87 17 87 19 87 21 87 23 87 25 87 27 87 29 87 31 87 33 0 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
958 1 2 3 958 5 6 7 958 9 10 11 958 13...

result:

ok Correct. (1000 test cases)

Test #16:

score: 0
Accepted
time: 14ms
memory: 2936kb

input:

500
4037 286
1756 1768
2770 2782
3095 3107
1405 1417
2705 2717
2913 2925
1847 1859
482 494
807 819
2744 2756
2822 2834
2276 2288
3238 3250
1106 1118
2055 2067
3056 3068
2328 2340
2146 2158
1249 1261
1015 1027
2224 2236
1613 1625
1717 1729
222 234
3329 3341
1795 1807
2354 2366
37 48
3082 3094
2068 20...

output:

4025 1 2 3 4 5 6 7 8 9 10 11 4025 13 14 15 16 17 18 19 20 21 22 23 4025 25 26 27 28 29 30 31 32 33 34 35 4025 37 38 39 40 41 42 43 44 45 46 47 4025 49 50 51 52 53 54 55 56 57 58 59 4025 61 62 63 64 65 66 67 68 69 70 71 4025 73 74 75 76 77 78 79 80 81 82 83 4025 85 86 87 88 89 90 91 92 93 94 95 4025 ...

result:

ok Correct. (500 test cases)

Extra Test:

score: 0
Extra Test Passed