Cod sursa(job #86012)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 23 septembrie 2007 13:34:49
Problema Curcubeu Scor 20
Compilator fpc Status done
Runda Autumn Warmup 2007, Runda 2 Marime 2.09 kb
program curcubeu;
var f,g:text;
        v,v1:array[1..3000001] of longint;
        n:longint;


procedure update_aint(nod,a,b,c,x,y:longint);
var m:longint;
begin
        if (a<=x)and(y<=b) then
                v[nod]:=c else
        begin
                m:=(x+y) div 2;
                if v[nod]<>-1 then
                        begin
                v[nod*2]:=v[nod];
                v[nod*2+1]:=v[nod];
                v[nod]:=-1;
                end;
                if (a<=m) then
                        begin
                                update_aint(nod*2,a,b,c,x,m);
                        end;
                if (b>m) then
                        begin
                                update_aint(nod*2+1,a,b,c,m+1,y);
                        end;
        end;
end;


procedure query_aint(nod,x,y:longint);
var m,i:longint;
begin
        if v[nod]<>-1 then
                begin
                        for i:=x to y do
                                v1[i]:=v[nod];
                end else
                begin
                        m:=(x+y) div 2;
                        query_aint(nod*2,x,m);
                        query_aint(nod*2+1,m+1,y);
                end;
end;


function min(x,y:longint):longint;
begin
        if x<y then min:=x else
        min:=y;
end;

function max(x,y:longint):longint;
begin
        if x>y then max:=x else
        max:=y;
end;


procedure van;
var i,a,b,c:longint;
begin
        assign(f,'curcubeu.in');reset(f);
        assign(g,'curcubeu.out');rewrite(g);
        readln(f,n,a,b,c);
        close(f);
        v[1]:=0;
        update_aint(1,min(a,b),max(a,b),c,1,n-1);
        for i:=2 to n-1 do
                begin
                        a:=(a*i) mod n;
                        b:=(b*i) mod n;
                        c:=(c*i) mod n;
                        update_aint(1,min(a,b),max(a,b),c,1,n-1);
                end;
        query_aint(1,1,n-1);
        for i:=1 to n-1 do
                writeln(g,v1[i]);
        close(g);
end;


procedure ila;
begin
end;

begin
        van;ila;
end.