Pagini recente » Cod sursa (job #318789) | Borderou de evaluare (job #1796724) | Cod sursa (job #278108) | Cod sursa (job #2506610) | Cod sursa (job #2241023)
#include <fstream>
using namespace std;
int n, i, j, k, maxim=-1, poz;
int v[100001], sol[100001], tata[100001], a[100001];
int cautbinar (int k, int x)
{
int st=1, dr=k;
while (st<=dr) {
int mid = (st+dr)/2;
if (v[a[mid]]>=x)
dr=mid-1;
else
st=mid+1;
}
return st;
}
int main () {
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
fin>>n;
for (i=1;i<=n;i++) {
fin>>v[i];
}
k=1;a[k]=1;tata[1]=0;
for (i=2;i<=n;i++) {
int p=cautbinar(k,v[i]);
a[p]=i;
k=max(k,p);
tata[i]=a[p-1];
if(p>maxim){
maxim=p;
poz=i;
}
}
fout<<maxim<<"\n";
k=maxim;
while(k>0){
sol[k]=v[poz];
k--;
poz=tata[poz];
}
for (i=1;i<=maxim;i++)
fout<<sol[i]<<" ";
return 0;
}