Cod sursa(job #2129618)

Utilizator stefzahZaharia Stefan Tudor stefzah Data 12 februarie 2018 22:45:36
Problema Order Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("order.in");
ofstream fout("order.out");
int n,i,p,nod1,q,n1;
bool f[32000];
struct elem{int val,ct;}v[70000];
void Remove(int nod,int V)
    {//cout<<nod<<" "<<v[nod].ct<<"\n";
     if(v[nod].val!=0){fout<<v[nod].val<<" ";
                       f[v[nod].val]=1;
                       v[nod].ct=0;
                       v[nod].val=0;
                       //v[nod/2].val=max(v[(nod/2)*2].val,v[(nod/2)*2+1].val);
                       nod1=nod;
                       while(nod1!=1)
                            {nod1=nod1/2;
                             v[nod1].ct--;
                             //v[nod1].val=v[]
                            }
                       }
       else {if(v[nod*2].ct<V)Remove(nod*2+1,V-v[nod*2].ct);
              else Remove(nod*2,V);
            }
    }
int main()
{fin>>n;
 p=1;
 while(p<n)
      p*=2;
 for(i=p;i<=p+n-1;i++)
    {v[i].val=i-p+1;
     v[i].ct=1;
    }

 for(i=p-1;i>=1;i--)
    v[i].ct=v[i*2].ct+v[i*2+1].ct;
 //for(i=1;i<=2*p-1;i++)
   // fout<<v[i].ct<<" ";
 q=1;n1=n;
 for(i=1;i<=n-1;i++)
    {q=q+i;
     if(q>n1)q=q%n1;
     if(q==0)q=n1;
     Remove(1,q);
     //fout<<q<<"\n";
     n1--;q--;
    }
 for(i=1;i<=n;i++)
        if(f[i]==0)fout<<i<<" ";
 //fout<<v[1].val<<" ";
}