Pagini recente » Cod sursa (job #635169) | Cod sursa (job #2939507) | Cod sursa (job #1872688) | Borderou de evaluare (job #2912984) | Cod sursa (job #1807022)
#include <stdio.h>
#define N_MAX 1000000
using namespace std;
FILE *fin = fopen("curcubeu.in", "r");
FILE *fout = fopen("curcubeu.out", "w");
int N, A, B, C;
int mic, mare;
int colour[N_MAX + 1];
int boss[N_MAX + 1];
int jump[N_MAX + 1];
int find(int x) {
int t;
if(x == boss[x])
return x;
else {
t = find(boss[x]);
boss[x] = t;
return t;
}
}
void unify(int x, int y) {
int i, j;
i = find(x);
j = find(y);
if (i != j) {
boss[j] = i;
jump[i] = jump[j];
}
}
struct anakin {
int inc, sf, color;
};
anakin pas[N_MAX + 1];
int main(){
int i, j;
int t;
int ver;
fscanf(fin, "%d %d %d %d", &N, &A, &B, &C);
for (t = 1; t <= N - 1; t++) {
if (A > B) {
mic = B;
mare = A;
}
else {
mic = A;
mare = B;
}
pas[t].inc = mic;
pas[t].sf = mare;
pas[t].color = C;
A = (1LL * A * (t + 1)) % N;
B = (1LL * B * (t + 1)) % N;
C = (1LL * C * (t + 1)) % N;
}
for (i = N - 1; i >= 1; i--) {
mic = pas[i].inc;
mare = pas[i].sf;
C = pas[i].color;
for (j = mic; j <= mare; j++) {
if (boss[j] == 0) { ///daca elementul curent nu a mai fost vizitat
boss[j] = j;
jump[j] = j;
if (boss[j - 1] != 0){///daca se poate uni cu elementul de sus
unify(j - 1, j);
}
colour[j] = C;
}
else {
if(boss[j - 1] != 0)
unify(j, j - 1);
j = jump[find(j)];
}
}
}
for (i = 1; i <= N - 1; i++)
fprintf(fout, "%d\n", colour[i]);
fclose(fin);
fclose(fout);
return 0;
}