/* * Author: srtry * Created: 2026-06-26T23:33:33+09:00 * Coding: utf-8-unix */ use proconio::input; use std::io::{stdout,Write,BufWriter}; const MAX_N:usize = 100001; #[inline(always)] fn add_bit_imos(bit_imos:&mut [isize;MAX_N], size:usize, idx:usize, x:isize) { let mut i = idx; while i <= size { bit_imos[i] += x; i += i & (!i + 1); } } #[inline(always)] fn sum_bit_imos(bit_imos:&[isize;MAX_N], idx:usize) -> usize { let mut i = idx; let mut s = 0; while i > 0 { s += bit_imos[i]; i -= i & (!i + 1); } s as usize } #[inline(always)] fn push_usize_to_string(s: &mut String, mut num: usize) { if num == 0 { // push_zero_to_string(s); s.push('0'); return; } // String の皮をひんむいて、中身の Vec を直接操作する(超高速) // ※ 整数を文字(ASCII)にするだけなので安全です let buf = unsafe { s.as_mut_vec() }; let start_idx = buf.len(); // 💡 これがやりたかった「純粋な計算式」! // 10で割った余りに '0' のバイト値(48)を足すと、その数字の文字コードになります while num > 0 { buf.push(b'0' + (num % 10) as u8); num /= 10; } // 逆順に入っているので、この数値の分だけ反転する buf[start_idx..].reverse(); } fn main() { input!{ n:usize, b:usize, q:usize, queries: [(usize,usize,usize);q] } let out = stdout(); let mut out = BufWriter::with_capacity(8*2100000,out.lock()); let mut ans:String = String::with_capacity(8*2100000); let mut bit_imos:[isize;MAX_N] = [0;MAX_N]; // xにi回加算された時のy,z let mut mem:[(usize,usize);MAX_N] = [(1,1);MAX_N]; for i in 1..=q { mem[i].1 = (3*mem[i-1].1) % b; // z_k mem[i].0 = (3*mem[i-1].0 % b) + (2*(i+1)*mem[i-1].1 % b); // y_k mem[i].0 %= b; } for (l,m,r) in queries { add_bit_imos(&mut bit_imos, n, l, 1); add_bit_imos(&mut bit_imos, n, r+1, -1); let k:usize= sum_bit_imos(&bit_imos, m); let x:usize = (1 + k) % b; push_usize_to_string(&mut ans, x); ans.push(' '); push_usize_to_string(&mut ans, mem[k].0); ans.push(' '); push_usize_to_string(&mut ans, mem[k].1); ans.push('\n'); } out.write_all(ans.as_bytes()).unwrap(); out.flush().unwrap(); }