Pagini recente » Cod sursa (job #163029) | Cod sursa (job #2968029) | Cod sursa (job #1265747) | Cod sursa (job #2076103) | Cod sursa (job #84441)
Cod sursa(job #84441)
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;
}