Cod sursa(job #2178663)

Utilizator flibiaVisanu Cristian flibia Data 19 martie 2018 17:30:25
Problema Curcubeu Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#pragma GCC optimize("03")
#include <bits/stdc++.h>
#define ll long long
#define L (pos << 1)
#define R (L | 1)

using namespace std;

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

int n, A, B, C, h[4000100], flag[4000100], lazy[4000100];

void update(int st, int dr, int pos, int l, int r){
	if(flag[pos]){
		h[pos] = lazy[pos];
		if(st != dr){
			lazy[L] = lazy[R] = lazy[pos];
			flag[L] = flag[R] = 1;
		}
		flag[pos] = 0;
		lazy[pos] = 0;
	}
	if(dr < l || st > r || st > dr)
		return;
	int mid = st + dr >> 1;
	if(l <= st && dr <= r){
		h[pos] = C;
		if(st != dr){
			lazy[L] = lazy[R] = C;
			flag[L] = flag[R] = 1;
		}
		return;
	}
	update(st, mid, L, l, r);
	update(mid + 1, dr, R, l, r);
}

void dive(int st, int dr, int pos){
	if(flag[pos]){
		h[pos] = lazy[pos];
		if(st != dr){
			lazy[L] = lazy[R] = lazy[pos];
			flag[L] = flag[R] = 1;
		}
		flag[pos] = 0;
	}
	if(st == dr){
		out << h[pos] << '\n';
		return;
	}
	int mid = st + dr >> 1;
	dive(st, mid, L);
	dive(mid + 1, dr, R);
}

int main(){
	in >> n >> A >> B >> C;
	for(int i = 1; i < n; i++){
		if(i > 1){
			A = ((ll)A * (ll)i) % n;
			B = ((ll)B * (ll)i) % n;
			C = ((ll)C * (ll)i) % n;
		}
		update(1, n - 1, 1, max(1, min(A, B)), max(A, B));	
	}
	dive(1, n - 1, 1);
	return 0;
}