#[allow(unused_imports)] #[macro_use] pub mod spella { #[macro_use] mod internal { macro_rules! rev { ($m:ident [$($t_front:tt)*] [] [$($t_rear:tt)*]) => { $m! { $($t_front)* $($t_rear)* } }; ($m:ident [$($t_front:tt)*] [$t_head:tt, $($t_tail:tt,)*] [$($t_rear:tt)*]) => { rev! { $m [$($t_front)*] [$($t_tail,)*] [$t_head, $($t_rear)*] } }; } macro_rules! __for_each_tuple_internal { (@invoke $m:ident! $(($i:tt: $T:ident),)+) => { $m! { $($i: $T),+ } }; ($m:ident!) => {}; ($m:ident! $i0:tt: $T0:ident, $($i:tt: $T:ident,)*) => { __for_each_tuple_internal! { $m! $($i: $T,)* } rev! { __for_each_tuple_internal [@invoke $m!] [($i0: $T0), $(($i: $T),)*] [] } }; } macro_rules! for_each_tuple { ($m:ident) => { __for_each_tuple_internal! { $m! 11: T11, 10: T10, 9: T9, 8: T8, 7: T7, 6: T6, 5: T5, 4: T4, 3: T3, 2: T2, 1: T1, 0: T0, } }; } } pub mod algebra { pub mod structures { pub use self::abelian_group::*; pub use self::associative_magma::*; pub use self::commutative_magma::*; pub use self::group::*; pub use self::invertible_magma::*; pub use self::magma::*; pub use self::monoid::*; pub use self::semigroup::*; pub use self::unital_magma::*; mod abelian_group { use super::{CommutativeMagma, Group}; pub trait AbelianGroup: Group + CommutativeMagma {} impl AbelianGroup for T {} } mod associative_magma { use super::Magma; pub trait AssociativeMagma: Magma {} impl AssociativeMagma for Option where T: AssociativeMagma {} impl AssociativeMagma for () {} macro_rules! imp { ($($i:tt: $T:ident),*) => { impl<$($T),*> AssociativeMagma for ($($T,)*) where $($T: AssociativeMagma,)* { } } } for_each_tuple! { imp } } mod commutative_magma { use super::Magma; pub trait CommutativeMagma: Magma {} impl CommutativeMagma for Option where T: CommutativeMagma {} impl CommutativeMagma for () {} macro_rules! imp { ($($i:tt: $T:ident),*) => { impl<$($T),*> CommutativeMagma for ($($T,)*) where $($T: CommutativeMagma,)* { } } } for_each_tuple! { imp } } mod group { use super::{AssociativeMagma, InvertibleMagma, UnitalMagma}; pub trait Group: AssociativeMagma + UnitalMagma + InvertibleMagma {} impl Group for T {} } mod invertible_magma { use super::{Magma, UnitalMagma}; pub trait InvertibleMagma: Magma + UnitalMagma { fn invert(&self) -> Self; fn inverse_op(&self, rhs: &Self) -> Self { self.op(&rhs.invert()) } fn inverse_op_assign_right(&mut self, rhs: &Self) { *self = self.inverse_op(rhs); } fn inverse_op_assign_left(&mut self, lhs: &Self) { *self = lhs.inverse_op(self); } } impl InvertibleMagma for () { fn invert(&self) -> Self { () } } macro_rules! imp { ($($i:tt: $T:ident),*) => { impl<$($T),*> InvertibleMagma for ($($T,)*) where $($T: InvertibleMagma,)* { fn invert(&self) -> Self { ($(self.$i.invert(),)*) } fn inverse_op(&self, rhs: &Self) -> Self { ($(self.$i.inverse_op(&rhs.$i),)*) } fn inverse_op_assign_right(&mut self, rhs: &Self) { $(self.$i.inverse_op_assign_right(&rhs.$i);)* } fn inverse_op_assign_left(&mut self, lhs: &Self) { $(self.$i.inverse_op_assign_left(&lhs.$i);)* } } } } for_each_tuple! { imp } } mod magma { pub trait Magma: Clone { fn op(&self, rhs: &Self) -> Self; fn op_assign_right(&mut self, rhs: &Self) { *self = self.op(rhs); } fn op_assign_left(&mut self, lhs: &Self) { *self = lhs.op(self); } } impl Magma for Option where T: Magma, { fn op(&self, rhs: &Self) -> Self { match (self, rhs) { (&Some(ref lhs), &Some(ref rhs)) => Some(lhs.op(rhs)), (&Some(ref value), &None) | (&None, &Some(ref value)) => Some(value.clone()), (&None, &None) => None, } } fn op_assign_right(&mut self, rhs: &Self) { match (self, rhs.as_ref()) { (&mut Some(ref mut lhs), Some(rhs)) => lhs.op_assign_right(rhs), (lhs @ &mut None, Some(rhs)) => *lhs = Some(rhs.clone()), (_, None) => {} } } fn op_assign_left(&mut self, lhs: &Self) { match (lhs.as_ref(), self) { (Some(lhs), &mut Some(ref mut rhs)) => rhs.op_assign_left(lhs), (Some(lhs), rhs @ &mut None) => *rhs = Some(lhs.clone()), (None, _) => {} } } } impl Magma for () { fn op(&self, _rhs: &Self) -> Self { () } } macro_rules! imp { ($($i:tt: $T:ident),*) => { impl<$($T),*> Magma for ($($T,)*) where $($T: Magma,)* { fn op(&self, rhs: &Self) -> Self { ($(self.$i.op(&rhs.$i),)*) } fn op_assign_right(&mut self, rhs: &Self) { $(self.$i.op_assign_right(&rhs.$i);)* } fn op_assign_left(&mut self, lhs: &Self) { $(self.$i.op_assign_left(&lhs.$i);)* } } }; } for_each_tuple! { imp } } mod monoid { use super::{AssociativeMagma, UnitalMagma}; pub trait Monoid: AssociativeMagma + UnitalMagma {} impl Monoid for T {} } mod semigroup { use super::AssociativeMagma; pub trait Semigroup: AssociativeMagma {} impl Semigroup for T {} } mod unital_magma { use super::Magma; pub trait UnitalMagma: Magma { fn identity() -> Self; } impl UnitalMagma for Option where T: Magma, { fn identity() -> Self { None } } impl UnitalMagma for () { fn identity() -> Self { () } } macro_rules! imp { ($($i:tt: $T:ident),*) => { impl<$($T),*> UnitalMagma for ($($T,)*) where $($T: UnitalMagma,)* { fn identity() -> Self { ($($T::identity(),)*) } } } } for_each_tuple! { imp } } } } pub mod byte { pub use self::byte_char::*; pub use self::byte_str::*; pub use self::byte_string::*; pub use self::from_byte_str::*; mod byte_char { use std::fmt::{self, Debug, Display, Formatter}; #[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct ByteChar(pub u8); impl Debug for ByteChar { fn fmt(&self, f: &mut Formatter) -> fmt::Result { write!(f, "b'{}'", self.0 as char) } } impl Display for ByteChar { fn fmt(&self, f: &mut Formatter) -> fmt::Result { write!(f, "{}", self.0 as char) } } } mod byte_str { use spella::byte::{ByteChar, ByteString}; use std::fmt::{self, Debug, Display, Formatter}; use std::ops::{Deref, DerefMut}; #[derive(PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct ByteStr([ByteChar]); macro_rules! cast { (mut $x:expr, $($T:ty)=>*) => { unsafe { &mut *($x $(as *mut $T)*) } }; ($x:expr, $($T:ty)=>*) => { unsafe { &*($x $(as *const $T)*) } }; } impl ByteStr { pub fn from_bytes(s: &[u8]) -> &Self { cast!(s, [u8] => [ByteChar] => ByteStr) } pub fn from_bytes_mut(s: &mut [u8]) -> &mut Self { cast!(mut s, [u8] => [ByteChar] => ByteStr) } pub fn from_byte_chars(s: &[ByteChar]) -> &Self { cast!(s, [ByteChar] => ByteStr) } pub fn from_byte_chars_mut(s: &mut [ByteChar]) -> &mut Self { cast!(mut s, [ByteChar] => ByteStr) } pub fn as_byte_chars(&self) -> &[ByteChar] { &self.0 } pub fn as_byte_chars_mut(&mut self) -> &mut [ByteChar] { &mut self.0 } pub fn as_bytes(&self) -> &[u8] { cast!(self, ByteStr => [ByteChar] => [u8]) } pub fn as_bytes_mut(&mut self) -> &mut [u8] { cast!(mut self, ByteStr => [ByteChar] => [u8]) } } impl ToOwned for ByteStr { type Owned = ByteString; fn to_owned(&self) -> ByteString { ByteString::from(self.0.to_owned()) } } impl Debug for ByteStr { fn fmt(&self, f: &mut Formatter) -> fmt::Result { write!(f, "b\"")?; for &c in &self.0 { write!(f, "{}", c)?; } write!(f, "\"") } } impl Display for ByteStr { fn fmt(&self, f: &mut Formatter) -> fmt::Result { for &c in &self.0 { write!(f, "{}", c)?; } Ok(()) } } impl Deref for ByteStr { type Target = [ByteChar]; fn deref(&self) -> &[ByteChar] { self.as_byte_chars() } } impl DerefMut for ByteStr { fn deref_mut(&mut self) -> &mut [ByteChar] { self.as_byte_chars_mut() } } } mod byte_string { use spella::byte::{ByteChar, ByteStr}; use std::borrow::{Borrow, BorrowMut}; use std::fmt::{self, Debug, Display, Formatter}; use std::ops::{Deref, DerefMut}; #[derive(Clone, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct ByteString(Vec); impl ByteString { pub fn into_byte_chars(self) -> Vec { self.0 } pub fn as_byte_str(&self) -> &ByteStr { ByteStr::from_byte_chars(&self.0) } pub fn as_mut_byte_str(&mut self) -> &mut ByteStr { ByteStr::from_byte_chars_mut(&mut self.0) } } impl From> for ByteString { fn from(s: Vec) -> ByteString { ByteString(s) } } impl Borrow for ByteString { fn borrow(&self) -> &ByteStr { self.as_byte_str() } } impl BorrowMut for ByteString { fn borrow_mut(&mut self) -> &mut ByteStr { self.as_mut_byte_str() } } impl Debug for ByteString { fn fmt(&self, f: &mut Formatter) -> fmt::Result { Debug::fmt(self.as_byte_str(), f) } } impl Display for ByteString { fn fmt(&self, f: &mut Formatter) -> fmt::Result { Display::fmt(self.as_byte_str(), f) } } impl Deref for ByteString { type Target = ByteStr; fn deref(&self) -> &ByteStr { ByteStr::from_byte_chars(&self.0) } } impl DerefMut for ByteString { fn deref_mut(&mut self) -> &mut ByteStr { ByteStr::from_byte_chars_mut(&mut self.0) } } } mod from_byte_str { use spella::byte::{ByteChar, ByteStr, ByteString}; use std::error::Error; use std::fmt::{self, Debug, Display, Formatter}; use std::str::{self, FromStr, Utf8Error}; pub trait FromByteStr: Sized { type Err; fn from_byte_str(s: &ByteStr) -> Result; } macro_rules! fn_description { () => { fn description(&self) -> &str { "description() is deprecated; use Display" } }; } #[derive(Debug)] pub struct ParseByteCharError(ParseByteCharErrorKind); #[derive(Debug)] enum ParseByteCharErrorKind { EmptyByteStr, TooManyByteChars, } impl Display for ParseByteCharError { fn fmt(&self, f: &mut Formatter) -> fmt::Result { use self::ParseByteCharErrorKind::*; f.write_str(match self.0 { EmptyByteStr => "empty `ByteStr`", TooManyByteChars => "too many `ByteChar`s", }) } } impl Error for ParseByteCharError { fn_description! {} } impl FromByteStr for ByteChar { type Err = ParseByteCharError; fn from_byte_str(s: &ByteStr) -> Result { use self::ParseByteCharErrorKind::*; match s.len() { 1 => Ok(unsafe { *s.get_unchecked(0) }), 0 => Err(ParseByteCharError(EmptyByteStr)), _ => Err(ParseByteCharError(TooManyByteChars)), } } } #[derive(Debug)] pub enum ParseByteStringError {} impl Display for ParseByteStringError { fn fmt(&self, _: &mut Formatter) -> fmt::Result { match *self {} } } impl Error for ParseByteStringError { fn_description! {} } impl FromByteStr for ByteString { type Err = ParseByteStringError; fn from_byte_str(s: &ByteStr) -> Result { Ok(ByteString::from(s.to_vec())) } } pub struct ParseFromStrError(ParseFromStrErrorKind); enum ParseFromStrErrorKind { Utf8Error(Utf8Error), FromStrError(T::Err), } impl Debug for ParseFromStrError where T::Err: Debug, { fn fmt(&self, f: &mut Formatter) -> fmt::Result { use self::ParseFromStrErrorKind::*; match self.0 { Utf8Error(ref err) => f.debug_tuple("Utf8Error").field(err).finish(), FromStrError(ref err) => f.debug_tuple("FromStrError").field(err).finish(), } } } impl Display for ParseFromStrError where T::Err: Display, { fn fmt(&self, f: &mut Formatter) -> fmt::Result { use self::ParseFromStrErrorKind::*; match self.0 { Utf8Error(ref err) => write!(f, "{}", err), FromStrError(ref err) => write!(f, "{}", err), } } } impl Error for ParseFromStrError where T::Err: Debug + Display, { fn_description! {} } impl FromByteStr for T { type Err = ParseFromStrError; fn from_byte_str(s: &ByteStr) -> Result { use self::ParseFromStrErrorKind::*; str::from_utf8(s.as_bytes()) .map_err(|e| ParseFromStrError(Utf8Error(e))) .and_then(|s| s.parse().map_err(|e| ParseFromStrError(FromStrError(e)))) } } } } pub mod io { pub use self::scanner::*; mod scanner { use spella::byte::{ByteStr, FromByteStr}; use std::io::{self, BufRead}; #[derive(Debug)] pub struct Scanner { reader: R, buf: Vec, pos: usize, } const INITIAL_CAPACITY: usize = 32; impl Scanner { pub fn new(reader: R) -> Self { Scanner { reader: reader, buf: Vec::with_capacity(INITIAL_CAPACITY), pos: 0, } } pub fn next(&mut self) -> io::Result> { self.next_byte_str().map(T::from_byte_str) } pub fn next_byte_str(&mut self) -> io::Result<&ByteStr> { if self.buf.is_empty() { self.read_line()?; } loop { match self.buf.get(self.pos) { Some(&b' ') => self.pos += 1, Some(&b'\n') => self.read_line()?, Some(_) => break, None => return Err(io::Error::from(io::ErrorKind::UnexpectedEof)), } } let start = self.pos; self.pos += 1; loop { match self.buf.get(self.pos) { Some(&b' ') | Some(&b'\n') | None => break, Some(_) => self.pos += 1, } } Ok(ByteStr::from_bytes(&self.buf[start..self.pos])) } fn read_line(&mut self) -> io::Result<()> { self.buf.clear(); self.pos = 0; self.reader.read_until(b'\n', &mut self.buf)?; Ok(()) } } } } pub mod sequences { pub use self::segment_tree::SegmentTree; pub mod segment_tree { use super::*; use spella::algebra::structures::Monoid; use std::collections::VecDeque; use std::iter::{self, FromIterator}; use std::mem; use std::ops::{Deref, DerefMut, Range}; #[derive(Clone, PartialEq, Eq, Debug, Hash)] pub struct SegmentTree { vec: Vec, base_len: usize, len: usize, } impl FromIterator for SegmentTree { fn from_iter(iter: I) -> Self where I: IntoIterator, { let iter = iter.into_iter(); let min_len = iter.size_hint().0; let (min_base_len, min_vec_len) = Self::extend_len(min_len); let mut deque = VecDeque::with_capacity(min_vec_len); if min_base_len > 1 { deque.extend(iter::repeat(M::identity()).take(min_base_len - 1)); } deque.extend(iter); let len = deque.len() - min_base_len.saturating_sub(1); let (base_len, _) = Self::extend_len(len); if base_len > min_base_len { for identity in iter::repeat(M::identity()).take(base_len - min_base_len) { deque.push_front(identity); } } else if min_base_len > base_len { deque.drain(..min_base_len - base_len); } let mut tree = SegmentTree { vec: deque.into(), base_len: base_len, len: len, }; for node in (1..base_len).rev() { tree.recalc(node); } tree } } impl SegmentTree { pub fn new(len: usize) -> Self { let (base_len, vec_len) = Self::extend_len(len); let vec = if vec_len == 0 { vec![] } else { vec![M::identity(); vec_len] }; SegmentTree { vec: vec, base_len: base_len, len: len, } } pub fn len(&self) -> usize { self.len } pub fn get(&self, index: usize) -> &M { assert_index(index, self.len()); self.node(self.node_index(index)) } pub fn get_mut(&mut self, index: usize) -> GetMut { assert_index(index, self.len()); GetMut { node: self.node_index(index), tree: self, } } pub fn fold(&self, index: Range) -> M { assert_index_range(&index, self.len()); let mut start = self.node_index(index.start); let mut end = self.node_index(index.end); let mut lacc = M::identity(); let mut racc = M::identity(); while start < end { if start & 1 == 1 { lacc.op_assign_right(self.node(start)); start += 1; } if end & 1 == 1 { end -= 1; racc.op_assign_left(self.node(end)); } start >>= 1; end >>= 1; } lacc.op(&racc) } fn extend_len(len: usize) -> (usize, usize) { if len == 0 { (0, 0) } else { len .checked_next_power_of_two() .and_then(|base_len| { (base_len - 1) .checked_add(len) .map(|vec_len| (base_len, vec_len)) }) .unwrap_or_else(|| panic!("length too large: {:?}", len)) } } fn node_index(&self, index: usize) -> usize { self.base_len + index } fn recalc(&mut self, node: usize) { let l = node << 1; let r = (node << 1) | 1; let last = self.vec.len(); debug_assert_eq!(last, self.node_index(self.len() - 1)); if l <= last { *self.node_mut(node) = if r <= last { self.node(l).op(&self.node(r)) } else { self.node(l).clone() }; } } fn rebuild(&mut self, mut node: usize) { while { node >>= 1; node > 0 } { self.recalc(node); } } fn node(&self, node: usize) -> &M { &self.vec[node - 1] } fn node_mut(&mut self, node: usize) -> &mut M { &mut self.vec[node - 1] } } pub struct GetMut<'a, M: 'a + Monoid> { tree: &'a mut SegmentTree, node: usize, } impl<'a, M: Monoid> Drop for GetMut<'a, M> { fn drop(&mut self) { self.tree.rebuild(self.node); } } impl<'a, M: Monoid> Deref for GetMut<'a, M> { type Target = M; fn deref(&self) -> &M { self.tree.node(self.node) } } impl<'a, M: Monoid> DerefMut for GetMut<'a, M> { fn deref_mut(&mut self) -> &mut M { self.tree.node_mut(self.node) } } impl<'a, M: Monoid> GetMut<'a, M> { pub fn update(&mut self, f: F) where F: FnOnce(M) -> M, { let value = mem::replace::(self, M::identity()); mem::replace::(self, f(value)); } } } use std::ops::{Range, RangeTo}; macro_rules! assert_index { ($cond:expr, $index:expr, $len:expr) => { assert!( $cond, "index out of bounds: the len is {:?} but the index is {:?}", $len, $index ) }; } fn assert_index(index: usize, len: usize) { assert_index!(index < len, index, len); } fn assert_index_range(index: &Range, len: usize) { assert!( index.start <= index.end, "range start is greater than range end: {:?}", index ); assert_index!(index.end <= len, index, len); } } } mod prelude { pub use spella::byte::{ByteChar, ByteStr, ByteString}; pub use std::collections::*; pub use std::io::prelude::*; pub use std::iter::FromIterator; pub use std::marker::PhantomData; pub use std::num::Wrapping; pub use std::ops::{Range, RangeFrom, RangeTo}; pub use std::{cell, cmp, f64, i32, i64, isize, iter, mem, rc, str, time, u32, u64, usize}; } use prelude::*; const CUSTOM_STACK_SIZE_MEBIBYTES: Option = None; fn main() { fn exec_solver() { let stdin = std::io::stdin(); let stdout = std::io::stdout(); #[cfg(not(debug_assertions))] let mut writer = std::io::BufWriter::new(stdout.lock()); #[cfg(debug_assertions)] let mut writer = stdout.lock(); solve(stdin.lock(), &mut writer); writer.flush().unwrap(); } if let Some(stack_size_mebibytes) = CUSTOM_STACK_SIZE_MEBIBYTES { std::thread::Builder::new() .name("exec_solver".to_owned()) .stack_size(stack_size_mebibytes * 1024 * 1024) .spawn(exec_solver) .unwrap() .join() .unwrap(); } else { exec_solver(); } } fn solve(reader: R, mut writer: W) { let mut _scanner = spella::io::Scanner::new(reader); #[allow(unused_macros)] macro_rules! scan { ($T:ty) => { _scanner.next::<$T>().unwrap().unwrap() }; ($($T:ty),+) => { ($(scan!($T)),+) }; ($($T:ty),+; $n:expr $(; $m:expr)*) => {{ (0..$n).map(|_| scan!($($T),+ $(; $m)*)).collect::>() }}; } #[allow(unused_macros)] macro_rules! scan_iter { ($($T:ty),+; $n:expr) => { (0..$n).map(|_| scan!($($T),+)) }; } #[allow(unused_macros)] macro_rules! print { ($fmt:expr) => { write!(writer, $fmt).unwrap() }; ($fmt:expr, $($arg:tt)*) => { write!(writer, $fmt, $($arg)*).unwrap() }; } #[allow(unused_macros)] macro_rules! println { ($fmt:expr) => { writeln!(writer, $fmt).unwrap() }; ($fmt:expr, $($arg:tt)*) => { writeln!(writer, $fmt, $($arg)*).unwrap() }; } #[allow(unused_macros)] macro_rules! eprint { ($fmt:expr) => { #[cfg(debug_assertions)] write!(std::io::stderr(), $fmt).unwrap() }; ($fmt:expr, $($arg:tt)*) => { #[cfg(debug_assertions)] write!(std::io::stderr(), $fmt, $($arg)*).unwrap() }; } #[allow(unused_macros)] macro_rules! eprintln { ($fmt:expr) => { #[cfg(debug_assertions)] writeln!(std::io::stderr(), $fmt).unwrap() }; ($fmt:expr, $($arg:tt)*) => { #[cfg(debug_assertions)] writeln!(std::io::stderr(), $fmt, $($arg)*).unwrap() }; } #[allow(unused_macros)] macro_rules! dbg { ($($x:expr),+) => {{ eprintln!(concat!("[{}:{}] ", $(stringify!($x), " = {:?}; "),+), file!(), line!(), $($x),+); }}; } use spella::algebra::structures::*; #[derive(Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Debug)] struct M(usize, u64); impl Magma for M { fn op(&self, rhs: &Self) -> Self { *if self.1 < rhs.1 { self } else { rhs } } } impl AssociativeMagma for M {} impl CommutativeMagma for M {} impl UnitalMagma for M { fn identity() -> Self { M(usize::max_value(), u64::max_value()) } } let (n, q) = scan!(usize, usize); let a = scan!(u64; n); let mut segtree = spella::sequences::SegmentTree::::from_iter( a.into_iter().enumerate().map(|(i, a_i)| M(i, a_i)), ); for (t, l, r) in scan_iter!(u8, usize, usize; q) { let l = l - 1; let r = r - 1; match t { 1 => { let M(_, a_l) = *segtree.get(l); let M(_, a_r) = *segtree.get(r); segtree.get_mut(r).1 = a_l; segtree.get_mut(l).1 = a_r; } 2 => { let M(i, _) = segtree.fold(l..r + 1); println!("{}", i + 1); } _ => unreachable!(), } } }