Pagini recente » Cod sursa (job #2740000) | Cod sursa (job #1105039) | Cod sursa (job #498078) | Cod sursa (job #1830154) | Cod sursa (job #2176617)
#include <iostream>
#include <fstream>
using namespace std;
int v[100005],sol[100005],poz[100005],k,s,n;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int cautpoz(int st, int dr, int x)
{
int mid;
while(st<=dr)
{
mid=(st+dr)/2;
if(v[sol[mid]]>=x && v[sol[mid-1]]<x) return mid;
if(v[sol[mid]]<=x) st=mid+1;
else dr=mid-1;
}
return k+1;
}
void scmax()
{
int i,j,aux;
sol[++k]=1;
for(i=2;i<=n;i++)
{
aux=cautpoz(1,k,v[i]);
if(aux==k+1)
{
sol[++k]=i;
poz[i]=sol[k-1];
}
else
{
sol[aux]=i;
poz[i]=sol[aux-1];
}
}
}
void rec(int x)
{
s++;
if(poz[x]!=0)
rec(poz[x]);
else fout<<s<<"\n";
fout<<v[x]<<" ";
}
int main()
{
int i;
fin>>n;
for(i=1;i<=n;i++)
{
fin>>v[i];
}
scmax();
rec(sol[k]);
fin.close();
fout.close();
return 0;
}