Pagini recente » Cod sursa (job #2281427) | Cod sursa (job #2562354) | Cod sursa (job #1360827) | Cod sursa (job #124459) | Cod sursa (job #876245)
Cod sursa(job #876245)
#include<iostream>
#include<fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n, a[100010], x[100010], p[100010], poz[100010], ux;
void citire(){
f>>n;
for(int i=1; i<=n; ++i) f>>a[i];
}
int binar(int k){
int j, t;
for(j=1, t=(1<<18); t;t=t>>1)
if(j+t<=ux)
if(x[j+t]<k) j+=t;
return j;
//return poz lui k sau poz celui mai mare nr < k in cazul in care nu apare k in sir
}
void prelucrare(){
int z, y;
x[1]=a[1]; ux=1; poz[1]=1;
for(int i=2;i<=n;++i){
y=a[i];
z=binar(y);
if(x[z]<y) z++;
if(z>ux) ux=z;
x[z]=y; poz[z]=i;
p[i]=poz[z-1];
}
}
int main(){
citire();
prelucrare();
int sol[100010], r=1;
for(int i=poz[ux]; i; i=p[i])
sol[r++]=a[i];
g<<ux<<'\n';
for(int i=r-1;i>0;--i) g<<sol[i]<<' ';
g<<'\n';
g.close();
return 0;
}