Cod sursa(job #2969182)

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

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(segTree[node])
            segTree[(node<<1)|1]=segTree[(node<<1)+2]=segTree[node], segTree[node]=0;
        int mid=(l+r)>>1;
        if(mid>=A)
            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(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);
        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);
    for(i=1;i<N;++i)
        fprintf(g, "%d\n", ans[i]);

    fclose(g);
    return 0;
}