Cod sursa(job #3167205)

Utilizator BuzdiBuzdugan Rares Andrei Buzdi Data 10 noiembrie 2023 12:46:46
Problema Curcubeu Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>

using namespace std;

ifstream cin("curcubeu.in");
ofstream cout("curcubeu.out");

const int NMAX = 1e6;

int n, A, B, C;
int aint[4 * NMAX + 1];
int lazy[4 * NMAX + 1];

void UpdateLazy(int node, int left, int right)
{
    if(lazy[node] != -1)
    {
        aint[node] = lazy[node];
        if(left != right)
        {
            lazy[node * 2] = lazy[node];
            lazy[node * 2 + 1] = lazy[node];
        }
        lazy[node] = -1;
    }
}

void Update(int node, int left, int right, int Uleft, int Uright, int value)
{
    UpdateLazy(node, left, right);
    if(left >= Uleft && right <= Uright)
    {
        lazy[node] = value;
        UpdateLazy(node, left, right);
        return;
    }

    int mid = (left + right) / 2;
    if(mid >= Uleft)
        Update(node * 2, left, mid, Uleft, Uright, value);
    if(mid + 1 <= Uright)
        Update(node * 2 + 1, mid + 1, right, Uleft, Uright, value);
}

void GetValues(int node, int left, int right)
{
    UpdateLazy(node, left, right);
    if(left == right)
    {
        cout << aint[node] << '\n';
        return;
    }

    int mid = (left + right) / 2;
    GetValues(node * 2, left, mid);
    GetValues(node * 2 + 1, mid + 1, right);
}

int main()
{
    cin >> n >> A >> B >> C;
    for(int i = 1; i <= 4 * n; i++)
        lazy[i] = -1;

    for(int i = 2; i <= n; i++)
    {
        Update(1, 1, n - 1, min(A, B), max(A, B), C);
        A = ((long long) A * i) % n;
        B = ((long long) B * i) % n;
        C = ((long long) C * i) % n;
    }

    GetValues(1, 1, n - 1);

    return 0;
}