-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCTRICK.c
80 lines (78 loc) · 1.34 KB
/
CTRICK.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include<stdio.h>
#include<string.h>
#define ll long long
ll n, bit[20005];
ll read(ll idx)
{
ll sum=0;
while(idx>0)
{
sum+=bit[idx];
idx-=(idx & -idx);
}
return sum;
}
ll updt(ll idx)
{
while(idx<=n)
{
bit[idx]++;
idx+=(idx & -idx);
}
}
int main()
{
ll t,i,j,k,cur,out[20005],c,tg,up;
scanf("%lld",&c);
while(c--)
{
scanf("%lld",&n);
memset(bit,0,sizeof(bit));
cur=0;
for(i=1;i<=n;i++)
{
t=n-read(n),tg;
if(i+1>t)
{
if((i+1)%t)
{
tg=(i+1)%t;
}
else
{
tg=t;
}
}
else tg=i+1;
//if(tg==0) tg=i+1;
up=t-cur+read(cur);
if(tg>up)
{
cur=0;
tg=tg-up;
}
ll c=cur+tg-read(cur+tg),p=cur-read(cur);
cur=cur+tg;
tg-=c-p;
while(tg>0)
{
p=c;
c=cur+tg-read(cur+tg);
cur+=tg;
tg-=c-p;
}
updt(cur);
out[cur]=i;
//cur=cur+1;
//if(cur>1) cur=1;
/*else
{
tg=tg-up;
cur=0;
}*/
}
for(i=1;i<=n;i++) printf("%lld ",out[i]);
printf("\n");
}
return 0;
}