Cod sursa(job #85949)

Utilizator raula_sanChis Raoul raula_san Data 23 septembrie 2007 12:16:25
Problema Curcubeu Scor 0
Compilator cpp Status done
Runda Autumn Warmup 2007, Runda 2 Marime 2.02 kb
#include <cstdio>

#define max_t 2000001
#define max_n 1000001

void read();
void solve();
void write();

long long unsigned N, A1, B1, C1, A, B, C, k;

int St[max_n], Colour[max_n], Count[max_n];

void up(int st, int dr)
{
          if(St[st] <= dr)
		  {
            Count[st] = ++ k;
			St[st] = dr;
			Colour[st] = C;
		  }
		  else
		  {
			St[dr+1] = St[st];
			Colour[dr+1] = Colour[st];
			St[st] = dr;
			Colour[st] = C;
			Count[st] = ++ k;
			Count[dr+1] = ++ k;
		  }
}

int main()
{
    read();
    solve();
    write();
    
    return 0;
}

void read()
{
     freopen("curcubeu.in", "rt", stdin);
     
     scanf("%llu %llu %llu %llu", &N, &A1, &B1, &C1);
     
     fclose(stdin);
}

void solve()
{
     int i, st, dr;
     
     for(i=1; i<N; ++i)
     {
              A = (A1 * i) % N;
              B = (B1 * i) % N;
              C = (C1 * i) % N;
              
              st = A < B ? A : B;
			  dr = A > B ? A : B;

              if(!st && !dr)
                     return;

              else if(!st)
                   st = 1;

              up(st, dr);
              
              A1 = A;
              B1 = B;
              C1 = C;
     }
}

void write()
{
     freopen("curcubeu.out", "wt", stdout);

     int i, c = 0, dr = 0, last = 0;
     
     for(i=1; i<N; ++i)
     {
              if(i < dr)
              {
                   if(St[i] && Count[i] > last)
                   {
                       last = Count[i];
                       dr = St[i];
                       c = Colour[i];
                   }
              }
              if(i > dr)
              {
                   if(St[i])
                   {
                            last = Count[i];
                            dr = St[i];
                            c = Colour[i];
                   }
                   else
                       c = 0;
              }
              
              printf("%d\n", c);
     }

     fclose(stdout);
}