Cod sursa(job #3362034)

Utilizator Andrei_GAndreiG Andrei_G Data 31 iulie 2026 20:05:08
Problema Curcubeu Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#pragma GCC optimize("O3,unroll-loops")
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <iomanip>
#include <numeric>
#include <cstdio>
#include <bitset>
#include <string>
#include <vector>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
//#define int long long
//#define int short
using namespace std;

const int nmax = 1e6;

int n, a, b, c, parent[nmax + 5], rez[nmax + 5];

void build(){
    for (int i = 1; i <= n; i++){
        parent[i] = i;
    }
}

int findset(int i){
    if (i == parent[i]){
        return i;
    }
    return parent[i] = findset(parent[i]);
}

void unionsets(int i, int j){
    parent[i] = findset(j);
}

struct query{
    int l;
    int r;
    int col;
}q[nmax + 5];

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    freopen("curcubeu.in", "r", stdin);
    freopen("curcubeu.out", "w", stdout);
    cin>>n>>a>>b>>c;
    q[1] = {min(a, b), max(a, b), c};
    for (int i = 2; i < n; i++){
        a = (1ll * a * i) % n;
        b = (1ll * b * i) % n;
        c = (1ll * c * i) % n;
        q[i] = {min(a, b), max(a, b), c};
    }
    build();
    for (int i = n - 1; i >= 1; i--){
        int curr = findset(q[i].l);
        while (curr <= q[i].r){
            rez[curr] = q[i].col;
            unionsets(curr, curr + 1);
            curr = findset(curr);
        }
    }
    for (int i = 1; i <= n - 1; i++){
        cout<<rez[i]<<"\n";
    }
}