Cod sursa(job #2969186)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 22 ianuarie 2023 18:12:28
Problema Curcubeu Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.13 kb
//Ilie Dumitru
#include<cstdio>

const int NMAX=1000005;

int N, ans[NMAX], A, B, C;
int segTree[NMAX<<2];

void segTreeSet(int node, int l, int r)
{
	if(A<=l && r<=B)
		segTree[node]=C;
	else
	{
		if(l<r && segTree[node])
			segTree[(node<<1)|1]=segTree[(node<<1)+2]=segTree[node], segTree[node]=0;
		int mid=l+((r-l)>>1);
		if(A<=mid)
			segTreeSet((node<<1)|1, l, mid);
		if(mid<B)
			segTreeSet((node<<1)+2, mid+1, r);
	}
}

void segTreeGet(int node, int l, int r)
{
	if(segTree[node])
		for(register int i=l;i<=r;++i)
			ans[i]=segTree[node];
	else if(l<r)
	{
		int mid=(l+r)>>1;
		segTreeGet((node<<1)|1, l, mid);
		segTreeGet((node<<1)+2, mid+1, r);
	}
}

int main()
{
	FILE* f=fopen("curcubeu.in", "r"), *g=fopen("curcubeu.out", "w");
	int i, aux;
	fscanf(f, "%d%d%d%d", &N, &A, &B, &C);
	if(B<A)
	{
		aux=A;
		A=B;
		B=aux;
	}
	fclose(f);

	for(i=1;i<N;++i)
	{
		segTreeSet(1, 0, N-1);
		A=A*(i+1)%N;
		B=B*(i+1)%N;
		if(B<A)
		{
			aux=A;
			A=B;
			B=aux;
		}
		C=C*(i+1)%N;
	}

	segTreeGet(1, 0, N-1);
	for(i=1;i<N;++i)
		fprintf(g, "%d\n", ans[i]);

	fclose(g);
	return 0;
}