Cod sursa(job #2708045)

Utilizator AACthAirinei Andrei Cristian AACth Data 18 februarie 2021 11:02:13
Problema Curcubeu Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb

#include <bits/stdc++.h>
using namespace std;
ifstream f("curcubeu.in");
ofstream g("curcubeu.out");
const int Max = 1e6 + 1;
void nos()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
}
#define color first
#define time second
int n,a,b,c;
pair < int, int >  tree[4*Max];
int rev[Max];
int timp;
int left_limit;
int right_limit;
int color;
void color_layer(int where, int left, int right)
{
    if(left_limit <= left and right <= right_limit)
    {
        tree[where].color = color;
        tree[where].time = timp;
        return;
    }
    int mid = (left + right) / 2;
    if(left_limit <= mid)
        color_layer(2*where,left,mid);
    if(mid + 1 <= right_limit)
        color_layer(2*where+1,mid+1,right);
}
void get_rev(int where, int left, int right)
{
    if(left == right)
    {
        rev[left] = where;
        return;
    }
    int mid = (left + right) / 2;
    get_rev(2*where,left,mid);
    get_rev(2*where+1,mid+1,right);
}
void read()
{
    f>>n>>a>>b>>c;

}

int sol[Max];
void interogation(int where, int left, int right, pair < int , int > parent)
{
    if(tree[where].time > parent.time)
        parent = tree[where];
    if(left == right)
    {
        sol[left] = parent.color;
        return;
    }
    int mid = (left + right) / 2;
    interogation(2*where,left,mid,parent);
    interogation(2*where+1,mid+1,right,parent);
}
void solve()
{
    int i;
    timp = 1;
    left_limit = min(a,b);
    right_limit = max(a,b);
    color = c;
    color_layer(1,1,n-1);

    for(i=2; i<n; i++)
    {
        timp = i;
        a = (1LL*a * i) % n;
        b = (1LL*b * i) % n;
        c = (1LL*c * i) % n;
        left_limit = min(a,b);
        right_limit = max(a,b);
        color = c;
        color_layer(1,1,n-1);
        // cout<<a<<' '<<b<<' '<<c<<'\n';
    }
    interogation(1,1,n-1,{0,0});
    for(i=1;i<n;i++)
        g<<sol[i]<<'\n';
}
void restart()
{

}

int32_t main()
{
    nos();

    read();
    solve();
    restart();

    return 0;
}