RT。
开O2过了,不开TLE 90pts,1.07s。
加读入优化1.05s
求卡常技巧
#include <cstdio>
#include <cstring>
unsigned int sd = 233;
#define N 700010
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
inline int rnd()
{
sd ^= sd << 13;
sd ^= sd >> 7;
sd ^= sd << 11;
return (int)sd;
}
struct node
{
int lson,rson,val,key,sz;
}tr[N];
int idx,root;
#define lson(x) tr[x].lson
#define rson(x) tr[x].rson
inline int newnode(int val)
{
tr[++idx].val = val;
tr[idx].key = rnd();
tr[idx].sz = 1;
return idx;
}
inline void pushup(int k)
{
tr[k].sz = tr[lson(k)].sz + tr[rson(k)].sz + 1;
}
void split(int k,int sz,int &x,int &y)
{
if(!k)
x = y = 0;
else
{
if(tr[lson(k)].sz < sz)
{
x = k;
split(rson(k),sz - tr[lson(k)].sz - 1,rson(k),y);
}
else
{
y = k;
split(lson(k),sz,x,lson(k));
}
pushup(k);
}
}
int merge(int x,int y)
{
if(!x || !y)
return x + y;
if(tr[x].key < tr[y].key)
{
rson(x) = merge(rson(x),y);
pushup(x);
return x;
}
else
{
lson(y) = merge(x,lson(y));
pushup(y);
return y;
}
}
int n;
int main()
{
n = read();
for(int i = 1;i <= n;i++)
root = merge(root,newnode(i));
int x,y;
for(int now = n,r;now >= 1;now--)
{
r = read();
r %= now;
split(root,r,x,y);
merge(y,x);
split(root,1,x,root);
printf("%d\n",tr[x].val);
}
return 0;
}