Pagini recente » Cod sursa (job #1022865) | Cod sursa (job #1626804) | Cod sursa (job #826537) | Cod sursa (job #2950657) | Cod sursa (job #1804734)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("curcubeu.in");
const int N = 1000010;
int dad[N],culoare[N],lim[N],a[N],b[N],c[N],h[N];
int Find (int x)
{
int node=x,aux;
while(x!=dad[x])
x=dad[x];
while(node!=x)
{
aux=dad[node];
dad[node]=x;
node=aux;
}
return x;
}
void Union (int x, int y)
{
if(h[x]>h[y])
{
dad[x]=y;
lim[y]=max(lim[x],lim[y]);
}
else
{
dad[y]=x;
lim[x]=max(lim[y],lim[x]);
}
if(h[x]==h[y])
h[y]++;
}
int main()
{
ofstream fout ("curcubeu.out");
int n,i,j,left,right;
fin>>n>>a[1]>>b[1]>>c[1];
for(i=2; i<n; 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(i=n-1; i>=1; i--)
{
left=min(a[i],b[i]);
right=max(a[i],b[i]);
for(j=left; j<=right; j++)
{
if(dad[j]==0)
{
dad[j]=j;
lim[j]=j;
if(dad[j-1]!=0)
Union(Find(j),Find(j-1));
if(dad[j+1]!=0)
Union(Find(j),Find(j-1));
culoare[j]=c[i];
}
else
j=lim[Find(j)];
}
}
for(i=1; i<n; i++)
fout<<culoare[i]<<"\n";
return 0;
}