Cod sursa(job #1735006)

Utilizator andreeainfo_dAndreea Dutulescu andreeainfo_d Data 28 iulie 2016 17:48:24
Problema Curcubeu Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <cstdio>
int i,aa,bb,cc,n,ras;
struct andreea
{
    int cul,lazy;
}aint[4000005];
void update (int nod, int st, int dr, int x, int y, int val)
{
    int mij;
    if(aint[nod].lazy!=0)
    {
        aint[nod].cul=aint[nod].lazy;
        if(st<dr)
        {
            aint[nod*2].lazy=aint[2*nod+1].lazy=aint[nod].lazy;
        }
        aint[nod].lazy=0;
    }
    if(x>y||x>dr||y<st||st>dr)return;
    if(x<=st&&y>=dr)
    {
        aint[nod].cul=val;
        if(st<dr)
        {
            aint[nod*2].lazy=aint[nod*2+1].lazy=val;
        }
        return;
    }
    mij=(st+dr)/2;
    update(nod*2,st,mij,x,y,val);
    update(nod*2+1,mij+1,dr,x,y,val);
    if(aint[nod*2].cul==aint[nod*2+1].cul)aint[nod].cul=aint[nod*2].cul;
    else aint[nod].cul=-1;
}
void query(int nod, int st, int dr, int x, int y, int ok)
{
    int mij;
    if(x>y||x>dr||y<st||st>dr)return;
    if(aint[nod].lazy!=0)
    {
        aint[nod].cul=aint[nod].lazy;
        if(st<dr)
        {
            aint[nod*2].lazy=aint[2*nod+1].lazy=aint[nod].lazy;
        }
        aint[nod].lazy=0;
    }
    if(st==dr)
    {
        return;
    }
    mij=(st+dr)/2;
    query(nod*2,st,mij,x,y,ok);
   query(nod*2+1,mij+1,dr,x,y,ok);
  /*  if(x<=st&&y>=dr&&ok==1)
    {
        ras=aint[nod].cul;
        return;
    }
    mij=(st+dr)/2;
    if(x<=mij)query(nod*2,st,mij,x,y,ok);
    if(y>mij)query(nod*2+1,mij+1,dr,x,y,ok);*/
}
void tsearch(int nod, int st, int dr, int poz)
{
    int mij;
    if(st==dr)
        {ras=aint[nod].cul;return;}
    mij=(st+dr)/2;
    if(poz<=mij)tsearch(nod*2,st,mij,poz);
    else tsearch(nod*2+1,mij+1,dr,poz);
}
int main()
{
    freopen("curcubeu.in","r",stdin);
    freopen("curcubeu.out","w",stdout);
    scanf("%d%d%d%d",&n,&aa,&bb,&cc);
    n--;
    for(i=1;i<=n;i++)
    {
        if(i>1)
        {
            aa=(aa*i)%(n+1);
            bb=(bb*i)%(n+1);
            cc=(cc*i)%(n+1);
        }
        if(aa<bb)update(1,1,n,aa,bb,cc);
        else update(1,1,n,bb,aa,cc);
    }
    query(1,1,n,1,n,0);
    for(i=1;i<=n;i++)
    {
        ras=0;
        tsearch(1,1,n,i);
        printf("%d\n",ras);
    }
    return 0;
}