Cod sursa(job #2601103)

Utilizator FrostfireMagirescu Tudor Frostfire Data 13 aprilie 2020 18:58:33
Problema Curcubeu Scor 60
Compilator cpp-64 Status done
Runda arfibinesaintratilaasta Marime 1.37 kb
#include <iostream>
#include <fstream>
#define NMAX 1000000

using namespace std;

ifstream f("curcubeu.in");
ofstream g("curcubeu.out");

int n, a[NMAX+10], b[NMAX+10], c[NMAX+10], sol[NMAX+10], tata[NMAX+10], nxt[NMAX+10];

int findDaddy(int x)
{   int r = x, y = x;
    while(r != tata[r]) r = tata[r];
    while(x != tata[x])
        {   x = tata[x];
            tata[y] = r;
            y = x;
        }
    return r;
}

int main()
{
    f >> n >> a[1] >> b[1] >> c[1];
    for(int i=1; i<n; i++) tata[i] = i, nxt[i] = i+1;
    for(int i=2; i<n; i++) a[i] = ((long long)a[i-1] * (long long)i) % n, b[i] = ((long long)b[i-1] * (long long)i) % n, c[i] = ((long long)c[i-1] * (long long)i) % n;
    for(int i=1; i<=4; i++) c[i] = i;
    for(int i=n-1; i; i--)
        {   pair <int, int> x;
            x.first = a[i];
            x.second = b[i];
            if(x.first > x.second) swap(x.first, x.second);
            x.first = max(1, x.first);
            x.first = findDaddy(x.first);
            for(int j=x.first; j<=x.second; j=nxt[j])
                {   if(!sol[j]) sol[j] = c[i];
                    tata[j] = x.first;
                    if(nxt[j] != j+1 && j != x.second) tata[j+1] = x.first;
                }
            nxt[x.first] = max(nxt[x.first], x.second+1);
        }
    for(int i=1; i<n; i++) g << sol[i] << '\n';
    return 0;
}