Pagini recente » Cod sursa (job #1330577) | Cod sursa (job #1799324) | Cod sursa (job #132887) | Cod sursa (job #1844169) | Cod sursa (job #226726)
Cod sursa(job #226726)
#include<stdio.h>
#define N 100005
int m,n,v[N],x[N],pred[N],lung[N];
int caut(int a)
{
int p=1,q=m,mid;
while(p!=q)
{
mid=(p+q)/2;
if(a<=v[x[mid]])
q=mid;
else
p=mid+1;
}
if(v[x[p]]<a)
++p;
return p;
}
void subsir(int p){
if(p==0) return;
subsir(pred[p]);
printf("%d ", v[p]);
}
int maxim(){
int zero=1;
for(int i=2; i<=n; ++i)
if(lung[i]>lung[zero])
zero=i;
return zero;
}
void parcurg(){
int poz;
x[1]=1;
pred[1]=0;
lung[1]=1;
m=1;
for(int i=2; i<=n; ++i){
poz=caut(v[i]);//x[poz]=pozitia celui mai mic elem din v, care a fost deja prel si e mai mare ca v[i]
x[poz]=i;
lung[i]=poz;
pred[i]=x[poz-1];
if(poz==m+1)
++m;
}
printf("%d\n",m);
poz=maxim();//poz va fi pozitia pe care se afla cea mai mare vloare din vectorul lung
subsir(poz);
}
int main(){
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
for(int i=1; i<=n; ++i){
scanf("%d", &v[i]);
}
parcurg();
return 0;
}