Pagini recente » Cod sursa (job #524388) | Cod sursa (job #2393937) | Cod sursa (job #1605171) | Cod sursa (job #3125892) | Cod sursa (job #1093717)
#include<fstream>
#include<algorithm>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int Nmax = 100005;
struct item{
int val,pos;
} a[Nmax];
int AIn[Nmax];
bool cmp(item _a,item _b){
return _a.val<_b.val;
}
int v[Nmax];
struct aitem{
int len,where;
} A[Nmax];
int Prev[Nmax],Seq[Nmax],K;
int N,M,Ans,Rec;
int lsb(int& x){
return (x&(-x));
}
void Update(int& j,int i,aitem& val){
while(i<=M){
if(val.len>A[i].len){
A[i].len=val.len;
A[i].where=j;
}
i+=lsb(i);
}
}
aitem Query(int i){
aitem s;
s.len=0,s.where=0;
while(i){
if(A[i].len>s.len){
s=A[i];
}
i-=lsb(i);
}
return s;
}
int main(){
in>>N;
for(int i=1;i<=N;i++) in>>AIn[i],a[i].val=AIn[i],a[i].pos=i;
sort(a+1,a+N+1,cmp);
for(int i=1;i<=N;i++){
if(a[i].val!=a[i-1].val) M++;
v[a[i].pos]=M;
}
for(int i=1;i<=N;i++){
aitem down=Query(v[i]-1);
down.len++;
Prev[i]=down.where;
down.where=i;
Update(i,v[i],down);
if(down.len>Ans){
Ans=down.len;
Rec=i;
}
}
out<<Ans<<'\n';
while(Rec){
Seq[++K]=Rec;
Rec=Prev[Rec];
}
for(int i=K;i>=1;i--) out<<AIn[Seq[i]]<<' ';
return 0;
}