Cod sursa(job #3167200)

Utilizator BuzdiBuzdugan Rares Andrei Buzdi Data 10 noiembrie 2023 12:40:48
Problema Curcubeu Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 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] != 0)
    {
        aint[node] = lazy[node];
        if(left != right)
        {
            lazy[node * 2] = lazy[node];
            lazy[node * 2 + 1] = lazy[node];
        }
        lazy[node] = 0;
    }
}

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 = 2; i <= n; i++)
    {
        Update(1, 1, n - 1, min(A, B), max(A, B), C);
        A = (A * i) % n;
        B = (B * i) % n;
        C = (C * i) % n;
    }

    GetValues(1, 1, n - 1);

    return 0;
}