Pagini recente » Cod sursa (job #3037366) | Cod sursa (job #1504381) | Cod sursa (job #3341853) | Cod sursa (job #3356479) | Cod sursa (job #3318221)
#include <bits/stdc++.h>
#define NMAX 1000001
using namespace std;
ifstream in("curcubeu.in");
ofstream out("curcubeu.out");
int a[NMAX], b[NMAX], c[NMAX];
int culori[NMAX]; //culoarea fiecarei casute
int t[NMAX], sz[NMAX]; //tatal fiecarui nod si marimea fiecarei paduri
int max_nod[NMAX]; ///cel mai mare nod din fiecare padure
int radacina(int nod) //radacina nodului
{
while(t[nod]!=0) nod=t[nod];
return nod;
}
void merge_padure(int nod1, int nod2) //combina doua paduri
{
int radacina_1=radacina(nod1), radacina_2=radacina(nod2);
if(sz[radacina_1]<sz[radacina_2])
{
t[radacina_1]=radacina_2;
sz[radacina_2]+=sz[radacina_1];
max_nod[radacina_2]=max(max_nod[radacina_2], max_nod[radacina_1]);
}
else
{
t[radacina_2]=radacina_1;
sz[radacina_1]+=sz[radacina_2];
max_nod[radacina_1]=max(max_nod[radacina_1], max_nod[radacina_2]);
}
}
int main()
{
int n;
in >> n;
for(int i=1; i<=n-1; i++)
{
sz[i]=1;
max_nod[i]=i;
}
in >> a[1] >> b[1] >> c[1];
for(int i=2; i<=n-1; i++)
{
a[i]=((long long)a[i-1]*i)%n;
b[i]=((long long)b[i-1]*i)%n;
c[i]=((long long)c[i-1]*i)%n;
}
for(int i=n-1; i>=1; i--) //luam operatiile de la final spre inceput
{
for(int j=a[i]; j<=b[i]; j++)
{
if(culori[j]==0) ///daca casuta nu a mai fost colorata pana acum
{
culori[j]=c[i];
if(j>a[i]) merge_padure(j-1, j);
}
else //daca casuta a mai fost colorata, atunci j face parte dintr-o padure
{
if(j>a[i]) merge_padure(j-1, j);
j=max_nod[radacina(j)]+1; ///sarim peste toate nodurile din padure
}
}
}
for(int i=1; i<=n-1; i++)
{
out << culori[i] << "\n";
}
return 0;
}