Pagini recente » Cod sursa (job #864391) | Cod sursa (job #2412567) | Cod sursa (job #40075) | Cod sursa (job #293988) | Cod sursa (job #1464474)
#include<cstdio>
#include<algorithm>
#define dim 10000
using namespace std;
struct thing{int val,poz;};
thing v0[100010];
int v[100010],vn[100010],aib[100010],lmax[100010],up[100010],sol[100010],poz=0;
char buff[dim];
bool cmp(thing a,thing b){
if(a.val<b.val)
return true;
return false;
}
void citeste(int &numar){
numar=0;
while(buff[poz]<'0'||buff[poz]>'9'){
poz++;
if(poz==dim){
fread(buff,1,dim,stdin);
poz=0;
}
}
while(buff[poz]>='0'&&buff[poz]<='9'){
numar=numar*10+buff[poz]-'0';
poz++;
if(poz==dim){
fread(buff,1,dim,stdin);
poz=0;
}
}
}
int query(int x){
int poz=0;
for(x;x>0;x-=(x&(x-1))^x)
if(lmax[aib[x]]>lmax[poz])
poz=aib[x];
return poz;
}
void update(int x,int poz){
for(x;x<=100000;x+=(x&(x-1))^x)
if(lmax[poz]>lmax[aib[x]])
aib[x]=poz;
}
int main(){
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n,i,maxim=-1,poz,numar;
fread(buff,1,dim,stdin);
citeste(n);
for(i=1;i<=n;i++){
citeste(numar);
v[i]=numar;
v0[i].val=v[i];
v0[i].poz=i;
}
sort(v0+1,v0+n+1,cmp);
v0[0].val=-1;
for(i=1;i<=n;i++)
if(v0[i].val!=v0[i-1].val)
vn[v0[i].poz]=i;
else
vn[v0[i].poz]=vn[v0[i-1].poz];
for(i=1;i<=n;i++){
up[i]=query(vn[i]-1);
lmax[i]=lmax[up[i]]+1;
update(vn[i],i);
if(lmax[i]>maxim){
maxim=lmax[i];
poz=i;
}
}
for(i=maxim;i>=1;i--){
sol[i]=v[poz];
poz=up[poz];
}
printf("%d\n",maxim);
for(i=1;i<=maxim;i++)
printf("%d ",sol[i]);
return 0;
}