emmm 由于它是从1…n加进去的 所以最终序列中的lis就是当前的lis
所以用平衡树维护最终序列就可以了
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int MaxN=100005;
int N,Tot,Root;
int A[MaxN],X[MaxN],F[MaxN],Ans[MaxN];
struct Node{
int v,size,priority;
int ch[2];
}Treap[MaxN];
#define LCH (Treap[cur].ch[0])
#define RCH (Treap[cur].ch[1])
void PushUp(int cur){
Treap[cur].size=Treap[LCH].size+Treap[RCH].size+1;
}
void Rotate(int &cur,int d){
int tmp=Treap[cur].ch[d^1];
Treap[cur].ch[d^1]=Treap[tmp].ch[d];
Treap[tmp].ch[d]=cur;
PushUp(cur),PushUp(tmp);
cur=tmp;
}
void Insert(int &cur,int rank,int v){
if(!cur){
cur=++Tot;
Treap[cur].v=v,Treap[cur].size=1,Treap[cur].priority=rand();
return;
}
int d;
if(rank<=Treap[LCH].size)
Insert(LCH,rank,v),d=0;
else Insert(RCH,rank-Treap[LCH].size-1,v),d=1;
if(Treap[Treap[cur].ch[d]].priority>Treap[cur].priority)
Rotate(cur,d^1);
PushUp(cur);
}
void DFS(int cur){
if(!cur)
return;
DFS(LCH);
A[++N]=Treap[cur].v;
DFS(RCH);
}
int main(){
int i,x;
scanf("%d",&N);
for(i=1;i<=N;i++){
scanf("%d",&x);
Insert(Root,x,i);
}
N=0,DFS(Root);
for(i=1;i<=N;i++)
X[i]=1<<30;
for(i=1;i<=N;i++){
x=lower_bound(X,X+N+1,A[i])-X;
Ans[A[i]]=x;
X[x]=A[i];
}
for(i=1;i<=N;i++){
Ans[i]=max(Ans[i],Ans[i-1]);
printf("%d\n",Ans[i]);
}
return 0;
}