Pagini recente » Cod sursa (job #884910) | Cod sursa (job #175681) | Cod sursa (job #2845784) | Cod sursa (job #860609) | Cod sursa (job #2976327)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int nMax=1e5+5;
int n, v[nMax], d[nMax], poz[nMax], p[nMax], k;
void dp()
{
k=1;
d[k]=v[1];
p[k]=1;
for(int i=2; i<=n; i++)
{
if(d[k]<v[i])
d[++k]=v[i], p[i]=k;
else
{
int st=1, dr=k, pozGasit=k+1;
while(st<=dr)
{
int m=(st+dr)/2;
if(v[i]<=d[m])
pozGasit=m, dr=m-1;
else st=m+1;
}
d[pozGasit]=v[i];
p[i]=pozGasit;
}
}
int j=n;
for(int i=k; i>=1; i--)
{
while(p[j]!=i)
j--;
poz[i]=j;
}
}
void afisare()
{
for(int i=1; i<=k; i++)
fout<<v[poz[i]]<<' ';
}
int main()
{
ios_base::sync_with_stdio(false);
fin.tie(0);
fin>>n;
for(int i=1; i<=n; i++)
fin>>v[i];
fin.close();
dp();
fout<<k<<'\n';
afisare();
fout.close();
return 0;
}