Cod sursa(job #87399)

Utilizator C_OvidiuCotletz Ovidiu C_Ovidiu Data 27 septembrie 2007 10:00:14
Problema Curcubeu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<stdio.h>
#define nmax 8097152
long v[nmax],n,a,b,c;
long min(long a,long b) {return (a<b)?a:b;}
long max(long a,long b) {return (a>b)?a:b;}

void add(long nod,long st,long dr,long a ,long b,long val)
{long mij;
 mij=(st+dr)/2;
 if(st>=a&&dr<=b)
   {v[nod]=val;
    return;}
 if(v[nod]&&nod*2+1<nmax)
  {v[nod*2]=v[nod*2+1]=v[nod];
   v[nod]=0;}
 if(a<=mij&&b>=st)
   add(nod*2,st,mij,a,b,val);
 if(a<=dr&&b>=mij+1)
   add(nod*2+1,mij+1,dr,a,b,val);

 }
long qst(long nod,long st,long dr,long val)
 {long mij;
  if(v[nod]||st==dr&&st==val)
     return v[nod];
  mij=(st+dr)/2;
  if(val<=mij&&val>=st)  return qst(nod*2,st,mij,val);
  else if(val>=mij+1&&val<=dr)  return qst(nod*2+1,mij+1,dr,val);
  }








int main()
{long i;
 freopen("curcubeu.in","r",stdin);
 scanf("%ld%ld%ld%ld",&n,&a,&b,&c);
 for(i=1;i<n;i++)
   {if(c)
    add(1,1,n-1,min(a,b),max(b,a),c);
    a=(a*(i+1))%n;
    b=(b*(i+1))%n;
    c=(c*(i+1))%n;
    }
 freopen("curcubeu.out","w",stdout);
  for(i=1;i<n;i++)
    {printf("%ld ",qst(1,1,n-1,i));
      if(!(i%10))
    printf("\n");
     }
 fclose(stdout);
 return 0;


 }