Cod sursa(job #84441)

Utilizator gigi_becaliGigi Becali gigi_becali Data 15 septembrie 2007 00:09:38
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
using namespace std;
#include <cstdio>
#include <cmath>
#include <deque>
#define maxn 100000
#define pb push_back
#define pf push_front

deque<int>H[350];
int SQRT;
int n;
int SQRTN;

inline void insert(int v)
{
  int p=0, i,cnt, n;
  ++SQRTN;
  for(p=0, cnt=512; cnt ; cnt>>=1)
    if(p+cnt<=SQRT)
      if(H[p+cnt].size()==SQRT)
	if(*(H[p+cnt].end()-1)<v)p+=cnt;

  
  //  while(H[p].size()==SQRT && *(H[p].end()-1)<v)++p;
  ++p;
  n=H[p].size();
 
  if(n==0)H[p].pb(v);
  else 
    {
       if(v<H[p][0]) H[p].pf(v);
       else
      	if(v>*(H[p].end()-1)) H[p].pb(v);
	else
	  {
	    
	    //  printf("da\n");
	  for(cnt=512, i=0; cnt ; cnt>>=1)
	    if(i+cnt<n)
	      if(H[p][i+cnt]<=v)i+=cnt;
	  
	  // printf("%d\n", i);
	  H[p].insert(H[p].begin()+i+1, v);
	  }
    }

  int ax;
  while(H[p].size()>SQRT)
    {
      ax=*(H[p].end()-1);
      H[p].pop_back();
      H[++p].pf(ax);
    }
}

inline void del(int v)
{
  //printf("(%d)\n", v);[
 int p=0, i,cnt, n;

 for(p=SQRT, cnt=512; cnt ; cnt>>=1)
    if(p-cnt>0)
      if(H[p-cnt].size())
	if(*(H[p-cnt].end()-1)>=v)p-=cnt;
	else;
      else p-=cnt;
  
  
  n=H[p].size();
 
  for(cnt=512, i=0; cnt ; cnt>>=1)
    if(i+cnt<n)
      if(H[p][i+cnt]<=v)i+=cnt;


  if(H[p][i]==v)
    {
      --SQRTN;
      if(i==0) H[p].pop_front();
      else if(i==H[p].size()-1) H[p].pop_back();
      else H[p].erase(H[p].begin()+i);
      
      
      int ax;
      while(H[p+1].size())
	{
	  ax=*(H[p+1].begin());
	  H[p].pb(ax);
	  H[p+1].pop_front();
	  ++p;
	}
      
    }

  
}



inline int findk(int k)
{
  int P=k/SQRT;
  int Q=k%SQRT;
  
  //  printf("%d %d %d\n", P, SQRT, Q);
  ++P; --Q;
  if(Q==-1){--P; Q=SQRT-1;}
  //printf("(%d %d)\n", P, Q);
  if(P<=SQRT+1)
    if(H[P].size()>=Q+1)return H[P][Q];
    else return 0;

  //  printf("%d %d\n", SQRT, SQRTN);
  //  printf("%d %d\n", P, Q);
  // printf("%d\n", H[P][Q]);

}

void afis()
{
  for(int i=1;i<=SQRT;++i)
    if(H[i].size())
    {
      for(int j=0;j<H[i].size();++j)printf("%d ", H[i][j]);
      printf("\n");
    }


}


inline void init(int n)
{
  int i, p=1;
  for(i=1;i<=n;++i)
    {
      if(H[p].size()==SQRT)++p;
      H[p].pb(i);
    }  

  
  

}




int main()
{
  srand(time(0));
  int i, n, K;
 // freopen("cerc.in","r",stdin);
  freopen("cerc.out","w",stdout);
 // scanf("%d %d\n", &n, &K);
  n=100000;K=100000;

  SQRT=(int)sqrt(n)+1;
  
  init(n);
  i=1;
  int  p=0;
  while(n)
    {
      p+=K;
      p%=n;
      if(i!=1) --p;
      if(p==-1)p=n-1;
      if(p==0)p=n;
      printf("%d\n", findk(p));
      del(findk(p));
      ++i;
      --n;
    }
 
 return 0;
}