Cod sursa(job #2535288)

Utilizator AlexNeaguAlexandru AlexNeagu Data 31 ianuarie 2020 18:43:12
Problema Curcubeu Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
int n;
int a[N], b[N], c[N], p[N], rg[N], ans[N];
ifstream in("curcubeu.in");
ofstream out("curcubeu.out");
int prod(int a, int b) {
  return (a * b) % n;
}
int fnd(int x) {
  int R = x;
  while(x != p[x]) {
    x = p[x];
  }
  while(R != p[R]) {
    int aux = p[R];
    p[R] = x;
    R = aux;
  }
  return x;
}
void uni(int x, int y) {
  x = fnd(x);
  y = fnd(y);
  if (x == y) {
    return;
  }
  if (rg[x] >= rg[y]) {
    rg[x] += rg[y];
    p[y] = x;
  }
  else {
    rg[y] += rg[x];
    p[x] = y;
  }
}
int main() {
  in >> n >> a[1] >> b[1] >> c[1];
  for (int i = 2; i <= n - 1; i++) {
    a[i] = prod(a[i - 1], i);
    b[i] = prod(b[i - 1], i);
    c[i] = prod(c[i - 1], i);
  }
  for (int i = 1; i <= n + 1; i++) {
    p[i] = i;
    rg[i] = 1;
    ans[i] = -1;
  }
  for (int i = n - 1; i >= 1; i--) {
    int start = min(a[i], b[i]);
    int en = max(a[i], b[i]);
    if (ans[start] != -1) {
      start += rg[fnd(start)];
    }
    int l = start;
    if (start <= en && ans[start] == -1) ans[start] = c[i];
    start++;
    while(start <= en) {
      if (ans[start] == -1) {
        ans[start] = c[i];
        uni(l, start);
      }
      start += rg[fnd(start)];
    }
  }
  for (int i = 1; i <= n - 1; i++) {
    ans[i] == -1 ? out << "0\n" : out << ans[i] << "\n";
  }
  return 0;
}