Cod sursa(job #1559672)

Utilizator stoianmihailStoian Mihail stoianmihail Data 31 decembrie 2015 14:03:32
Problema Curcubeu Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>

#define Nadejde 1000001

int N;
int A[Nadejde];
int B[Nadejde];
int C[Nadejde];
int next[Nadejde];
int color[Nadejde];

/** max(X, Y). **/
int MAX(int X, int Y) {
  return X > Y ? X : Y;
}

/** Precalculeaza valorile A, B si C. **/
void init() {
  int i, tmp;

  for (i = next[1] = 2; i < N; i++) {
    next[i] = i + 1;
    A[i] = (1LL * A[i - 1] * i) % N;
    B[i] = (1LL * B[i - 1] * i) % N;
    C[i] = (1LL * C[i - 1] * i) % N;
    if (B[i] < A[i]) {
      tmp = A[i];
      A[i] = B[i];
      B[i] = tmp;
    }
  }
}

int main(void) {
  int i, j, tmp;
  FILE *f = fopen("curcubeu.in", "r");

  /* Citirea datelor. */
  fscanf(f, "%d %d %d %d", &N, &A[1], &B[1], &C[1]);
  fclose(f);

  init();

  /* Calcularea solutiei. */
  for (i = N - 1; i; i--) {
    for (j = A[i]; j <= B[i]; ) {
      if (color[j]) {
        tmp = next[j];
        next[j] = MAX(next[j], B[i] + 1);
        j = tmp;
      } else {
        color[j] = C[i];
        next[j++] = B[i] + 1;
      }
    }
  }

  /* Afisarea solutiei. */
  freopen("curcubeu.out", "w", stdout);
  for (i = 1; i < N; i++) {
    fprintf(stdout, "%d\n", color[i]);
  }
  fclose(stdout);

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}