結果
問題 | No.2762 Counting and Deleting |
ユーザー |
![]() |
提出日時 | 2024-05-17 21:32:50 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 255 ms / 4,000 ms |
コード長 | 28,640 bytes |
コンパイル時間 | 15,021 ms |
コンパイル使用メモリ | 401,328 KB |
実行使用メモリ | 15,144 KB |
最終ジャッジ日時 | 2024-12-20 13:17:39 |
合計ジャッジ時間 | 18,542 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 15 |
コンパイルメッセージ
warning: type alias `Map` is never used --> src/main.rs:4:6 | 4 | type Map<K, V> = BTreeMap<K, V>; | ^^^ | = note: `#[warn(dead_code)]` on by default warning: type alias `Deque` is never used --> src/main.rs:6:6 | 6 | type Deque<T> = VecDeque<T>; | ^^^^^
ソースコード
use std::io::Write;use std::collections::*;type Map<K, V> = BTreeMap<K, V>;type Set<T> = BTreeSet<T>;type Deque<T> = VecDeque<T>;fn run() {input! {n: usize,q: usize,s: bytes,ask: [(u8, usize1, usize); q],}let mut set = (0..n).collect::<Set<_>>();let mut seg = SegmentTreePURQ::new(n, Matrix::one(3), |a, b| a.matmul(b));for (i, s) in s.iter().enumerate() {let mut mat = Matrix::one(3);if *s == b'0' {mat[0].fill(M::one());} else {mat[1].fill(M::one());}seg.update_tmp(i, mat);}seg.update_all();let out = std::io::stdout();let mut out = std::io::BufWriter::new(out.lock());for (op, l, r) in ask {if op == 1 {while let Some(&x) = set.range(l..r).next() {set.remove(&x);seg.update(x, Matrix::one(3));}} else {let ans = seg.find(l, r)[1][2];writeln!(out, "{}", ans).ok();}}}fn main() {run();}type M = ModInt<998244353>;// ---------- begin input macro ----------// reference: https://qiita.com/tanakh/items/0ba42c7ca36cd29d0ac8#[macro_export]macro_rules! input {(source = $s:expr, $($r:tt)*) => {let mut iter = $s.split_whitespace();input_inner!{iter, $($r)*}};($($r:tt)*) => {let s = {use std::io::Read;let mut s = String::new();std::io::stdin().read_to_string(&mut s).unwrap();s};let mut iter = s.split_whitespace();input_inner!{iter, $($r)*}};}#[macro_export]macro_rules! input_inner {($iter:expr) => {};($iter:expr, ) => {};($iter:expr, $var:ident : $t:tt $($r:tt)*) => {let $var = read_value!($iter, $t);input_inner!{$iter $($r)*}};}#[macro_export]macro_rules! read_value {($iter:expr, ( $($t:tt),* )) => {( $(read_value!($iter, $t)),* )};($iter:expr, [ $t:tt ; $len:expr ]) => {(0..$len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>()};($iter:expr, chars) => {read_value!($iter, String).chars().collect::<Vec<char>>()};($iter:expr, bytes) => {read_value!($iter, String).bytes().collect::<Vec<u8>>()};($iter:expr, usize1) => {read_value!($iter, usize) - 1};($iter:expr, $t:ty) => {$iter.next().unwrap().parse::<$t>().expect("Parse error")};}// ---------- end input macro ----------use std::ops::*;// ---------- begin trait ----------pub trait Zero: Sized + Add<Self, Output = Self> {fn zero() -> Self;fn is_zero(&self) -> bool;}pub trait One: Sized + Mul<Self, Output = Self> {fn one() -> Self;fn is_one(&self) -> bool;}pub trait SemiRing: Zero + One {}pub trait Ring: SemiRing + Sub<Output = Self> + Neg<Output = Self> {}pub trait Field: Ring + Div<Output = Self> {}impl<T> SemiRing for T where T: Zero + One {}impl<T> Ring for T where T: SemiRing + Sub<Output = Self> + Neg<Output = Self> {}impl<T> Field for T where T: Ring + Div<Output = Self> {}// ---------- end trait ----------// ---------- begin modint ----------pub const fn pow_mod(mut r: u32, mut n: u32, m: u32) -> u32 {let mut t = 1;while n > 0 {if n & 1 == 1 {t = (t as u64 * r as u64 % m as u64) as u32;}r = (r as u64 * r as u64 % m as u64) as u32;n >>= 1;}t}pub const fn primitive_root(p: u32) -> u32 {let mut m = p - 1;let mut f = [1; 30];let mut k = 0;let mut d = 2;while d * d <= m {if m % d == 0 {f[k] = d;k += 1;}while m % d == 0 {m /= d;}d += 1;}if m > 1 {f[k] = m;k += 1;}let mut g = 1;while g < p {let mut ok = true;let mut i = 0;while i < k {ok &= pow_mod(g, (p - 1) / f[i], p) > 1;i += 1;}if ok {break;}g += 1;}g}pub const fn is_prime(n: u32) -> bool {if n <= 1 {return false;}let mut d = 2;while d * d <= n {if n % d == 0 {return false;}d += 1;}true}#[derive(Clone, Copy, PartialEq, Eq)]pub struct ModInt<const M: u32>(u32);impl<const M: u32> ModInt<{ M }> {const REM: u32 = {let mut t = 1u32;let mut s = !M + 1;let mut n = !0u32 >> 2;while n > 0 {if n & 1 == 1 {t = t.wrapping_mul(s);}s = s.wrapping_mul(s);n >>= 1;}t};const INI: u64 = ((1u128 << 64) % M as u128) as u64;const IS_PRIME: () = assert!(is_prime(M));const PRIMITIVE_ROOT: u32 = primitive_root(M);const ORDER: usize = 1 << (M - 1).trailing_zeros();const fn reduce(x: u64) -> u32 {let _ = Self::IS_PRIME;let b = (x as u32 * Self::REM) as u64;let t = x + b * M as u64;let mut c = (t >> 32) as u32;if c >= M {c -= M;}c as u32}const fn multiply(a: u32, b: u32) -> u32 {Self::reduce(a as u64 * b as u64)}pub const fn new(v: u32) -> Self {assert!(v < M);Self(Self::reduce(v as u64 * Self::INI))}pub const fn const_mul(&self, rhs: Self) -> Self {Self(Self::multiply(self.0, rhs.0))}pub const fn pow(&self, mut n: u64) -> Self {let mut t = Self::new(1);let mut r = *self;while n > 0 {if n & 1 == 1 {t = t.const_mul(r);}r = r.const_mul(r);n >>= 1;}t}pub const fn inv(&self) -> Self {assert!(self.0 != 0);self.pow(M as u64 - 2)}pub const fn get(&self) -> u32 {Self::reduce(self.0 as u64)}pub const fn zero() -> Self {Self::new(0)}pub const fn one() -> Self {Self::new(1)}}impl<const M: u32> Add for ModInt<{ M }> {type Output = Self;fn add(self, rhs: Self) -> Self::Output {let mut v = self.0 + rhs.0;if v >= M {v -= M;}Self(v)}}impl<const M: u32> Sub for ModInt<{ M }> {type Output = Self;fn sub(self, rhs: Self) -> Self::Output {let mut v = self.0 - rhs.0;if self.0 < rhs.0 {v += M;}Self(v)}}impl<const M: u32> Mul for ModInt<{ M }> {type Output = Self;fn mul(self, rhs: Self) -> Self::Output {self.const_mul(rhs)}}impl<const M: u32> Div for ModInt<{ M }> {type Output = Self;fn div(self, rhs: Self) -> Self::Output {self * rhs.inv()}}impl<const M: u32> AddAssign for ModInt<{ M }> {fn add_assign(&mut self, rhs: Self) {*self = *self + rhs;}}impl<const M: u32> SubAssign for ModInt<{ M }> {fn sub_assign(&mut self, rhs: Self) {*self = *self - rhs;}}impl<const M: u32> MulAssign for ModInt<{ M }> {fn mul_assign(&mut self, rhs: Self) {*self = *self * rhs;}}impl<const M: u32> DivAssign for ModInt<{ M }> {fn div_assign(&mut self, rhs: Self) {*self = *self / rhs;}}impl<const M: u32> Neg for ModInt<{ M }> {type Output = Self;fn neg(self) -> Self::Output {if self.0 == 0 {self} else {Self(M - self.0)}}}impl<const M: u32> std::fmt::Display for ModInt<{ M }> {fn fmt<'a>(&self, f: &mut std::fmt::Formatter<'a>) -> std::fmt::Result {write!(f, "{}", self.get())}}impl<const M: u32> std::fmt::Debug for ModInt<{ M }> {fn fmt<'a>(&self, f: &mut std::fmt::Formatter<'a>) -> std::fmt::Result {write!(f, "{}", self.get())}}impl<const M: u32> std::str::FromStr for ModInt<{ M }> {type Err = std::num::ParseIntError;fn from_str(s: &str) -> Result<Self, Self::Err> {let val = s.parse::<u32>()?;Ok(ModInt::new(val))}}impl<const M: u32> From<usize> for ModInt<{ M }> {fn from(val: usize) -> ModInt<{ M }> {ModInt::new((val % M as usize) as u32)}}// ---------- end modint ----------// ---------- begin precalc ----------pub struct Precalc<const MOD: u32> {fact: Vec<ModInt<MOD>>,ifact: Vec<ModInt<MOD>>,inv: Vec<ModInt<MOD>>,}impl<const MOD: u32> Precalc<MOD> {pub fn new(size: usize) -> Self {let mut fact = vec![ModInt::one(); size + 1];let mut ifact = vec![ModInt::one(); size + 1];let mut inv = vec![ModInt::one(); size + 1];for i in 2..=size {fact[i] = fact[i - 1] * ModInt::from(i);}ifact[size] = fact[size].inv();for i in (2..=size).rev() {inv[i] = ifact[i] * fact[i - 1];ifact[i - 1] = ifact[i] * ModInt::from(i);}Self { fact, ifact, inv }}pub fn fact(&self, n: usize) -> ModInt<MOD> {self.fact[n]}pub fn ifact(&self, n: usize) -> ModInt<MOD> {self.ifact[n]}pub fn inv(&self, n: usize) -> ModInt<MOD> {assert!(0 < n);self.inv[n]}pub fn perm(&self, n: usize, k: usize) -> ModInt<MOD> {if k > n {return ModInt::zero();}self.fact[n] * self.ifact[n - k]}pub fn binom(&self, n: usize, k: usize) -> ModInt<MOD> {if n < k {return ModInt::zero();}self.fact[n] * self.ifact[k] * self.ifact[n - k]}}// ---------- end precalc ----------impl<const M: u32> Zero for ModInt<{ M }> {fn zero() -> Self {Self::zero()}fn is_zero(&self) -> bool {self.0 == 0}}impl<const M: u32> One for ModInt<{ M }> {fn one() -> Self {Self::one()}fn is_one(&self) -> bool {self.get() == 1}}// ---------- begin array op ----------struct NTTPrecalc<const M: u32> {sum_e: [ModInt<{ M }>; 30],sum_ie: [ModInt<{ M }>; 30],}impl<const M: u32> NTTPrecalc<{ M }> {const fn new() -> Self {let cnt2 = (M - 1).trailing_zeros() as usize;let root = ModInt::new(ModInt::<{ M }>::PRIMITIVE_ROOT);let zeta = root.pow((M - 1) as u64 >> cnt2);let mut es = [ModInt::zero(); 30];let mut ies = [ModInt::zero(); 30];let mut sum_e = [ModInt::zero(); 30];let mut sum_ie = [ModInt::zero(); 30];let mut e = zeta;let mut ie = e.inv();let mut i = cnt2;while i >= 2 {es[i - 2] = e;ies[i - 2] = ie;e = e.const_mul(e);ie = ie.const_mul(ie);i -= 1;}let mut now = ModInt::one();let mut inow = ModInt::one();let mut i = 0;while i < cnt2 - 1 {sum_e[i] = es[i].const_mul(now);sum_ie[i] = ies[i].const_mul(inow);now = ies[i].const_mul(now);inow = es[i].const_mul(inow);i += 1;}Self { sum_e, sum_ie }}}struct NTTPrecalcHelper<const MOD: u32>;impl<const MOD: u32> NTTPrecalcHelper<MOD> {const A: NTTPrecalc<MOD> = NTTPrecalc::new();}pub trait ArrayAdd {type Item;fn add(&self, rhs: &[Self::Item]) -> Vec<Self::Item>;}impl<T> ArrayAdd for [T]whereT: Zero + Copy,{type Item = T;fn add(&self, rhs: &[Self::Item]) -> Vec<Self::Item> {let mut c = vec![T::zero(); self.len().max(rhs.len())];c[..self.len()].copy_from_slice(self);c.add_assign(rhs);c}}pub trait ArrayAddAssign {type Item;fn add_assign(&mut self, rhs: &[Self::Item]);}impl<T> ArrayAddAssign for [T]whereT: Add<Output = T> + Copy,{type Item = T;fn add_assign(&mut self, rhs: &[Self::Item]) {assert!(self.len() >= rhs.len());self.iter_mut().zip(rhs).for_each(|(x, a)| *x = *x + *a);}}impl<T> ArrayAddAssign for Vec<T>whereT: Zero + Add<Output = T> + Copy,{type Item = T;fn add_assign(&mut self, rhs: &[Self::Item]) {if self.len() < rhs.len() {self.resize(rhs.len(), T::zero());}self.as_mut_slice().add_assign(rhs);}}pub trait ArraySub {type Item;fn sub(&self, rhs: &[Self::Item]) -> Vec<Self::Item>;}impl<T> ArraySub for [T]whereT: Zero + Sub<Output = T> + Copy,{type Item = T;fn sub(&self, rhs: &[Self::Item]) -> Vec<Self::Item> {let mut c = vec![T::zero(); self.len().max(rhs.len())];c[..self.len()].copy_from_slice(self);c.sub_assign(rhs);c}}pub trait ArraySubAssign {type Item;fn sub_assign(&mut self, rhs: &[Self::Item]);}impl<T> ArraySubAssign for [T]whereT: Sub<Output = T> + Copy,{type Item = T;fn sub_assign(&mut self, rhs: &[Self::Item]) {assert!(self.len() >= rhs.len());self.iter_mut().zip(rhs).for_each(|(x, a)| *x = *x - *a);}}impl<T> ArraySubAssign for Vec<T>whereT: Zero + Sub<Output = T> + Copy,{type Item = T;fn sub_assign(&mut self, rhs: &[Self::Item]) {if self.len() < rhs.len() {self.resize(rhs.len(), T::zero());}self.as_mut_slice().sub_assign(rhs);}}pub trait ArrayDot {type Item;fn dot(&self, rhs: &[Self::Item]) -> Vec<Self::Item>;}impl<T> ArrayDot for [T]whereT: Mul<Output = T> + Copy,{type Item = T;fn dot(&self, rhs: &[Self::Item]) -> Vec<Self::Item> {assert!(self.len() == rhs.len());self.iter().zip(rhs).map(|p| *p.0 * *p.1).collect()}}pub trait ArrayDotAssign {type Item;fn dot_assign(&mut self, rhs: &[Self::Item]);}impl<T> ArrayDotAssign for [T]whereT: MulAssign + Copy,{type Item = T;fn dot_assign(&mut self, rhs: &[Self::Item]) {assert!(self.len() == rhs.len());self.iter_mut().zip(rhs).for_each(|(x, a)| *x *= *a);}}pub trait ArrayMul {type Item;fn mul(&self, rhs: &[Self::Item]) -> Vec<Self::Item>;}impl<T> ArrayMul for [T]whereT: Zero + One + Copy,{type Item = T;fn mul(&self, rhs: &[Self::Item]) -> Vec<Self::Item> {if self.is_empty() || rhs.is_empty() {return vec![];}let mut res = vec![T::zero(); self.len() + rhs.len() - 1];for (i, a) in self.iter().enumerate() {for (res, b) in res[i..].iter_mut().zip(rhs.iter()) {*res = *res + *a * *b;}}res}}// transform でlen=1を指定すればNTTになるpub trait ArrayConvolution {type Item;fn transform(&mut self, len: usize);fn inverse_transform(&mut self, len: usize);fn convolution(&self, rhs: &[Self::Item]) -> Vec<Self::Item>;}impl<const M: u32> ArrayConvolution for [ModInt<{ M }>] {type Item = ModInt<{ M }>;fn transform(&mut self, len: usize) {let f = self;let n = f.len();let k = (n / len).trailing_zeros() as usize;assert!(len << k == n);assert!(k <= ModInt::<{ M }>::ORDER);let pre = &NTTPrecalcHelper::<{ M }>::A;for ph in 1..=k {let p = len << (k - ph);let mut now = ModInt::one();for (i, f) in f.chunks_exact_mut(2 * p).enumerate() {let (x, y) = f.split_at_mut(p);for (x, y) in x.iter_mut().zip(y.iter_mut()) {let l = *x;let r = *y * now;*x = l + r;*y = l - r;}now *= pre.sum_e[(!i).trailing_zeros() as usize];}}}fn inverse_transform(&mut self, len: usize) {let f = self;let n = f.len();let k = (n / len).trailing_zeros() as usize;assert!(len << k == n);assert!(k <= ModInt::<{ M }>::ORDER);let pre = &NTTPrecalcHelper::<{ M }>::A;for ph in (1..=k).rev() {let p = len << (k - ph);let mut inow = ModInt::one();for (i, f) in f.chunks_exact_mut(2 * p).enumerate() {let (x, y) = f.split_at_mut(p);for (x, y) in x.iter_mut().zip(y.iter_mut()) {let l = *x;let r = *y;*x = l + r;*y = (l - r) * inow;}inow *= pre.sum_ie[(!i).trailing_zeros() as usize];}}let ik = ModInt::new(2).inv().pow(k as u64);for f in f.iter_mut() {*f *= ik;}}fn convolution(&self, rhs: &[Self::Item]) -> Vec<Self::Item> {if self.len().min(rhs.len()) <= 32 {return self.mul(rhs);}const PARAM: usize = 10;let size = self.len() + rhs.len() - 1;let mut k = 0;while (size + (1 << k) - 1) >> k > PARAM {k += 1;}let len = (size + (1 << k) - 1) >> k;let mut f = vec![ModInt::zero(); len << k];let mut g = vec![ModInt::zero(); len << k];f[..self.len()].copy_from_slice(self);g[..rhs.len()].copy_from_slice(rhs);f.transform(len);g.transform(len);let mut buf = [ModInt::zero(); 2 * PARAM - 1];let buf = &mut buf[..(2 * len - 1)];let pre = &NTTPrecalcHelper::<{ M }>::A;let mut now = ModInt::one();for (i, (f, g)) in f.chunks_exact_mut(2 * len).zip(g.chunks_exact(2 * len)).enumerate(){let mut r = now;for (f, g) in f.chunks_exact_mut(len).zip(g.chunks_exact(len)) {buf.fill(ModInt::zero());for (i, f) in f.iter().enumerate() {for (buf, g) in buf[i..].iter_mut().zip(g.iter()) {*buf = *buf + *f * *g;}}f.copy_from_slice(&buf[..len]);for (f, buf) in f.iter_mut().zip(buf[len..].iter()) {*f = *f + r * *buf;}r = -r;}now *= pre.sum_e[(!i).trailing_zeros() as usize];}f.inverse_transform(len);f.truncate(self.len() + rhs.len() - 1);f}}// ---------- end array op ----------// ---------- begin matrix ----------#[derive(Clone)]pub struct Matrix<T> {h: usize,w: usize,a: Box<[T]>,}impl<T> Matrix<T> {pub fn new(h: usize, w: usize, a: Vec<T>) -> Self {assert!(a.len() == h * w);Self {h,w,a: a.into_boxed_slice(),}}pub fn iter(&self) -> impl Iterator<Item = &[T]> {self.a.chunks_exact(self.w)}pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut [T]> {self.a.chunks_exact_mut(self.w)}pub fn swap_row(&mut self, mut x: usize, mut y: usize) {assert!(x < self.h && y < self.h);if x == y {return;}if x > y {std::mem::swap(&mut x, &mut y);}let w = self.w;let (l, r) = self.a.split_at_mut(y * w);l[(x * w)..(x * w + w)].swap_with_slice(&mut r[..w]);}pub fn swap_col(&mut self, x: usize, y: usize) {assert!(x < self.w && y < self.w);for mat in self.iter_mut() {mat.swap(x, y);}}}impl<T> Matrix<T>whereT: Clone,{pub fn to_vec(&self) -> Vec<Vec<T>> {self.iter().map(|a| Vec::from(a)).collect()}pub fn minor(&self, x: usize, y: usize) -> Self {assert!(x < self.h && y < self.w);let mut a = vec![];for (i, b) in self.iter().enumerate() {for (j, b) in b.iter().enumerate() {if i != x && j != y {a.push(b.clone());}}}Self::new(self.h - 1, self.w - 1, a)}}impl<T> Matrix<T>whereT: Add<Output = T> + Clone,{pub fn matadd(&self, rhs: &Self) -> Self {assert_eq!((self.h, self.w), (rhs.h, rhs.w));let mut res = self.clone();for (res, a) in res.a.iter_mut().zip(rhs.a.iter()) {*res = res.clone() + a.clone();}res}}impl<T> Matrix<T>whereT: Zero + Clone,{pub fn zero(h: usize, w: usize) -> Self {Self::new(h, w, vec![T::zero(); h * w])}pub fn is_zero(&self) -> bool {self.a.iter().all(|a| a.is_zero())}}impl<T> Matrix<T>whereT: Zero + One + Clone,{pub fn one(n: usize) -> Self {let mut res = Self::new(n, n, vec![T::zero(); n * n]);for (i, res) in res.iter_mut().enumerate() {res[i] = T::one();}res}pub fn is_one(&self) -> bool {assert!(self.h == self.w);for (i, a) in self.iter().enumerate() {for (j, a) in a.iter().enumerate() {if (i == j && !a.is_one()) || (i != j && !a.is_zero()) {return false;}}}true}}impl<T> Matrix<T>whereT: Sub<Output = T> + Clone,{pub fn matsub(&self, rhs: &Self) -> Self {assert_eq!((self.h, self.w), (rhs.h, rhs.w));let mut res = self.clone();for (res, a) in res.a.iter_mut().zip(rhs.a.iter()) {*res = res.clone() - a.clone();}res}}impl<T> Matrix<T>whereT: Zero + Mul<Output = T> + Clone,{pub fn matmul(&self, rhs: &Self) -> Self {assert_eq!(self.w, rhs.h);let mut res = Self::new(self.h, rhs.w, vec![T::zero(); self.h * rhs.w]);for (res, a) in res.iter_mut().zip(self.iter()) {for (a, b) in a.iter().zip(rhs.iter()) {for (res, b) in res.iter_mut().zip(b.iter()) {*res = res.clone() + a.clone() * b.clone();}}}res}}impl<T> Matrix<T>whereT: SemiRing + Clone,{pub fn matpow(&self, mut k: usize) -> Self {assert_eq!(self.h, self.w);let n = self.h;let mut res = Self::one(n);let mut r = self.clone();while k > 0 {if k & 1 == 1 {res = res.matmul(&r);}r = r.matmul(&r);k >>= 1;}res}}impl<T> Matrix<T>whereT: Field + Copy + std::fmt::Debug,{pub fn gaussian_elimination(&mut self) -> (usize, T) {let mut x = 0;let mut y = 0;let mut tmp = Vec::with_capacity(self.w);let mut det = T::one();while x < self.h && y < self.w {if let Some(pos) = (x..self.h).find(|a| !self[*a][y].is_zero()) {if x != pos {det = -det;self.swap_row(x, pos);}det = det * self[x][y];let inv = T::one() / self[x][y];for mat in self[x][y..].iter_mut() {*mat = *mat * inv;}tmp.clear();tmp.extend_from_slice(&self[x]);for (i, mat) in self.iter_mut().enumerate() {if i == x {continue;}let v = mat[y];for (mat, tmp) in mat[y..].iter_mut().zip(tmp[y..].iter()) {*mat = *mat - v * *tmp;}}x += 1;} else {det = T::zero();}y += 1;}(x, det)}pub fn determinant(&self) -> T {assert_eq!(self.h, self.w);self.clone().gaussian_elimination().1}pub fn inverse(&self) -> Option<Self> {assert_eq!(self.h, self.w);let n = self.h;let mut mat = Self::zero(n, 2 * n);for (i, (mat, a)) in mat.iter_mut().zip(self.iter()).enumerate() {mat[..n].copy_from_slice(a);mat[n + i] = T::one();}let (_, det) = mat.gaussian_elimination();if det.is_zero() {return None;}let mut a = Vec::with_capacity(n * n);for mat in mat.iter() {a.extend_from_slice(&mat[n..]);}Some(Self::new(n, n, a))}}impl<T> Index<usize> for Matrix<T> {type Output = [T];fn index(&self, x: usize) -> &Self::Output {let w = self.w;&self.a[(x * w)..((x + 1) * w)]}}impl<T> IndexMut<usize> for Matrix<T> {fn index_mut(&mut self, x: usize) -> &mut Self::Output {let w = self.w;&mut self.a[(x * w)..((x + 1) * w)]}}// ---------- end matrix ----------// ---------- begin segment tree Point Update Range Query ----------pub struct SegmentTreePURQ<T, F> {n: usize,size: usize,data: Vec<T>,e: T,op: F,}impl<T, F> SegmentTreePURQ<T, F>whereT: Clone,F: Fn(&T, &T) -> T,{pub fn new(n: usize, e: T, op: F) -> Self {assert!(n > 0);let size = n.next_power_of_two();let data = vec![e.clone(); 2 * size];SegmentTreePURQ {n,size,data,e,op,}}pub fn update_tmp(&mut self, x: usize, v: T) {assert!(x < self.n);self.data[x + self.size] = v;}pub fn update_all(&mut self) {for i in (1..self.size).rev() {self.data[i] = (self.op)(&self.data[2 * i], &self.data[2 * i + 1]);}}pub fn update(&mut self, x: usize, v: T) {assert!(x < self.n);let mut x = x + self.size;self.data[x] = v;x >>= 1;while x > 0 {self.data[x] = (self.op)(&self.data[2 * x], &self.data[2 * x + 1]);x >>= 1;}}pub fn find(&self, l: usize, r: usize) -> T {assert!(l <= r && r <= self.n);if l == r {return self.e.clone();}let mut l = self.size + l;let mut r = self.size + r;let mut x = self.e.clone();let mut y = self.e.clone();while l < r {if l & 1 == 1 {x = (self.op)(&x, &self.data[l]);l += 1;}if r & 1 == 1 {r -= 1;y = (self.op)(&self.data[r], &y);}l >>= 1;r >>= 1;}(self.op)(&x, &y)}pub fn max_right<P>(&self, l: usize, f: P) -> usizewhereP: Fn(&T) -> bool,{assert!(l <= self.n);assert!(f(&self.e));if l == self.n {return self.n;}let mut l = l + self.size;let mut sum = self.e.clone();while {l >>= l.trailing_zeros();let v = (self.op)(&sum, &self.data[l]);if !f(&v) {while l < self.size {l <<= 1;let v = (self.op)(&sum, &self.data[l]);if f(&v) {sum = v;l += 1;}}return l - self.size;}sum = v;l += 1;l.count_ones() > 1} {}self.n}pub fn min_left<P>(&self, r: usize, f: P) -> usizewhereP: Fn(&T) -> bool,{assert!(r <= self.n);assert!(f(&self.e));if r == 0 {return 0;}let mut r = r + self.size;let mut sum = self.e.clone();while {r -= 1;while r > 1 && r & 1 == 1 {r >>= 1;}let v = (self.op)(&self.data[r], &sum);if !f(&v) {while r < self.size {r = 2 * r + 1;let v = (self.op)(&self.data[r], &sum);if f(&v) {sum = v;r -= 1;}}return r + 1 - self.size;}sum = v;(r & (!r + 1)) != r} {}0}}// ---------- end segment tree Point Update Range Query ----------