Pagini recente » Cod sursa (job #2798802) | Cod sursa (job #1824661) | Cod sursa (job #2294802) | Cod sursa (job #1095980) | Cod sursa (job #2158198)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int a[100005], t[100005], last[100005], ind[100005], sol[100005];
int main()
{
int n, k=1, s, d, mij, poz;
f>>n;
for(int i=1; i<=n; i++)
f>>a[i];
last[1]=a[1];
ind[1]=1;
t[1]=0;
for(int i=2; i<=n; i++)
{
if(a[i]>last[k])
{
k++;
last[k]=a[i];
ind[k]=i;
t[i]=ind[k-1];
}
else
{
poz=0;
s=1;
d=k;
mij=(s+d)/2;
do
{
if(last[mij]==a[i])
break;
else if(last[mij]>a[i])
{
poz=k;
s=mij+1;
}
else d=mij-1;
mij=(s+d)/2;
}
while(s<=d);
if(poz)
{
last[poz]=a[i];
t[i]=ind[poz-1];
ind[poz]=i;
}
else t[i]=0;
}
}
poz=1;
int i=ind[k];
while(i)
{
sol[poz++]=a[i];
i=t[i];
}
g<<poz-1<<'\n';
for(i=poz-1; i>=1; i--)
g<<sol[i]<<' ';
return 0;
}