Link to this code: https://cses.fi/paste/20e88167eaa56b82c7c43b/
use std::error::Error;
use std::io::{self, BufRead, BufWriter, Write};
use std::thread::{self, JoinHandle};

fn run(
  scanner: &mut Scanner<io::StdinLock>,
  writer: &mut BufWriter<io::StdoutLock>,
  _case: i32,
)
{
  macro_rules! display {
        () => {
            writeln!(writer).unwrap();
        };
        ($arg:expr) => {
            write!(writer, "{}", $arg).unwrap();
        };
        ($arg:expr, $($rest:expr),*) => {
            write!(writer, "{}", $arg).unwrap();
            display!($($rest),*);
        };
    }

  let n: usize = scanner.next();
  let k: usize = scanner.next();

  let (x0, a, b, c): (u32, u32, u32, u32) = (
    scanner.next(),
    scanner.next(),
    scanner.next(),
    scanner.next(),
  );

  let mut result: u32 = 0;

  let mut or_value: u32 = x0;
  let mut freq: [u32; 32] = [0; 32];
  (0..32).for_each(|pos: usize| {
    if ((or_value >> pos) & 1) > 0
    {
      freq[pos] += 1;
    }
  });

  let mut x: Vec<u32> = vec![0; n];
  x[0] = x0;
  for i in 1..k
  {
    x[i] = ((a as u64 * x[i - 1] as u64 + b as u64) % c as u64) as u32;
    or_value |= x[i];

    let mut curr: u32 = x[i];
    while curr > 0
    {
      let pos: usize = curr.trailing_zeros() as usize;
      freq[pos] += 1;
      curr &= curr - 1;
    }
  }

  result ^= or_value;

  let mut window_start: usize = 0;
  for i in k..n
  {
    x[i] = ((a as u64 * x[i - 1] as u64 + b as u64) % c as u64) as u32;

    let mut curr: u32 = x[i];
    while curr > 0
    {
      let pos: usize = curr.trailing_zeros() as usize;
      if freq[pos] == 0
      {
        or_value |= 1 << pos;
      }

      freq[pos] += 1;
      curr &= curr - 1;
    }

    curr = x[window_start];
    while curr > 0
    {
      let pos: usize = curr.trailing_zeros() as usize;
      if freq[pos] == 1
      {
        or_value ^= 1 << pos;
      }

      freq[pos] -= 1;
      curr &= curr - 1;
    }

    window_start += 1;
    result ^= or_value;
  }

  display!(result, "\n");
}

struct Scanner<B>
{
  reader: B,
  buffer: Vec<String>,
  pos: usize,
}

impl<B: BufRead> Scanner<B>
{
  fn new(reader: B) -> Self
  {
    Self {
      reader,
      buffer: Vec::new(),
      pos: 0,
    }
  }

  fn next<T: std::str::FromStr>(&mut self) -> T
  where
    T::Err: std::fmt::Debug,
  {
    self.ensure_buffered();
    let val = self.buffer[self.pos].parse().unwrap();
    self.pos += 1;
    val
  }

  fn ensure_buffered(&mut self)
  {
    if self.pos >= self.buffer.len()
    {
      let mut line = String::new();
      self.reader.read_line(&mut line).unwrap();
      self.buffer = line.split_whitespace().map(|s| s.to_owned()).collect();
      self.pos = 0;
    }
  }
}

fn main() -> Result<(), Box<dyn Error>>
{
  let stack_size: usize = 268435456;

  let handle: JoinHandle<()> = thread::Builder::new()
    .stack_size(stack_size)
    .spawn(|| {
      let stdin = io::stdin();
      let stdout = io::stdout();
      let mut scanner = Scanner::new(stdin.lock());
      let mut writer = BufWriter::new(stdout.lock());

      #[allow(unused_assignments)]
      let t: i32 = 1;

      (1..=t).for_each(|i| run(&mut scanner, &mut writer, i));
      writer.flush().unwrap();
    })
    .expect(&format!(
      "Failed to spawn thread. [STACK SIZE {} bytes]",
      stack_size
    ));

  handle.join().unwrap();
  Ok(())
}