Pagini recente » Cod sursa (job #758850) | Cod sursa (job #832876) | Cod sursa (job #2854740) | Cod sursa (job #1175596) | Cod sursa (job #1804789)
#include <stdio.h>
#include <algorithm>
using namespace std;
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()
{
freopen ("curcubeu.in","r",stdin);
freopen ("curcubeu.out","w",stdout);
int n,i,j,left,right;
scanf("%d%d%d%d",&n,&a[1],&b[1],&c[1]);
for(i=2; i<n; i++)
{
a[i]=(1LL*i*a[i-1])%n;
b[i]=(1LL*i*b[i-1])%n;
c[i]=(1LL*i*c[i-1])%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));
culoare[j]=c[i];
}
else
{
if(dad[j-1]!=0)
Union(Find(j),Find(j-1));
j=lim[Find(j)];
}
}
}
for(i=1; i<n; i++)
printf("%d\n",culoare[i]);
return 0;
}