Cod sursa(job #87388)

Utilizator C_OvidiuCotletz Ovidiu C_Ovidiu Data 27 septembrie 2007 09:34:15
Problema Curcubeu Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include<stdio.h>
#define nmax 2097152
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&&nod<nmax)
   {v[nod]=val;
    return;}
 //if(b<st||a>dr) 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(st>dr) return 0;
  if(v[nod])
     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++)
   {
    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\n",qst(1,1,n-1,i));
 fclose(stdout);
 return 0;


 }