Cod sursa(job #86060)

Utilizator moga_florianFlorian MOGA moga_florian Data 23 septembrie 2007 14:28:01
Problema Curcubeu Scor 50
Compilator cpp Status done
Runda Autumn Warmup 2007, Runda 2 Marime 1.65 kb
#include <stdio.h>

FILE *fout= fopen("curcubeu.out","w");
int arb[3000010];

int MIN(int x,int y){
    if(x<y)
        return x;
    return y;
}

int MAX(int x,int y){
    if(x>y)
        return x;
    return y;
}

void insert(int ind, int li, int lf, int a,int b, int C){
    if(b < a)
        return;

    if(lf<a || b<li)
        return;
        
    if(a<=li && lf<=b){
        arb[ind] = C;
        return;
    }

    if(arb[ind] >= 0){
        arb[2*ind] = arb[2*ind+1] = arb[ind];
        arb[ind] = -1;
    }
    
    int mij = (li+lf) >> 1;
    insert(2*ind, li, mij, a,b,C);
    insert(2*ind+1, mij+1, lf, a,b,C);
    
    if(arb[ind] == -1 && arb[2*ind] == arb[2*ind+1] && arb[2*ind] >= 0)
        arb[ind] = arb[2*ind];
}

void afish(int ind,int li,int lf){
    if(lf < li)
        return;

    if(arb[ind] >= 0){
        for(int i=li; i<=lf;i++)
            if(i)
                fprintf(fout,"%d\n",arb[ind]);
    }
    else{
        int mij = (li+lf) >> 1;
        afish(2*ind, li, mij);
        afish(2*ind+1, mij+1, lf);
    }
}

int main(){

    FILE *fin = fopen("curcubeu.in","r");
         
    int N,A,B,C;
    fscanf(fin,"%d%d%d%d",&N,&A,&B,&C);
    arb[1] = 0;
    
    insert(1,0,N-1,MIN(A,B), MAX(A,B),C);
    
    for(int t = 2; t<N; t++){
        A = (int) ( ((long long)A * (long long)t )%(long long)N );
        B = (int) ( ((long long)B * (long long)t )%(long long)N );
        C = (int) ( ((long long)C * (long long)t )%(long long)N );
        
        insert(1,0,N-1,MIN(A,B), MAX(A,B) , C);
    }
    
    afish(1,0,N-1);

    fclose(fin);
    fclose(fout);
    return 0;
}