Pagini recente » Cod sursa (job #3191983) | Cod sursa (job #324030) | Cod sursa (job #2951305) | Cod sursa (job #2544371) | Cod sursa (job #2784437)
#include <fstream>
using namespace std;
int v[100005], dp[100005], pozitii[100005];
int rasp[100005];
int caut_binar(int st, int dr, int x)
{
int raspuns=0;
while(st<=dr)
{
int mij=(st+dr)/2;
if(v[pozitii[mij]]>=x)
{
dr=mij-1;
}
else
{
raspuns=mij;
st=mij+1;
}
}
return raspuns;
}
int main()
{
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n;
fin>>n;
for(int i=1;i<=n;i++)
{
fin>>v[i];
}
int j=0;
for(int i=1;i<=n;i++)
{
if(v[i]>v[pozitii[j]])
{
j++;
dp[i]=dp[pozitii[j-1]]+1;
pozitii[j]=i;
//fout<<"v[i]="<<v[i]<<'\n';
//fout<<"j="<<j<<'\n';
}
else
{
int anterior=caut_binar(1,j,v[i]);
pozitii[anterior+1]=i;
dp[i]=dp[pozitii[anterior]]+1;
}
}
fout<<j<<'\n';
int lung_max=j;
int lung_curenta=lung_max-1;
rasp[lung_max]=v[pozitii[j]];
for(int i=pozitii[j]-1;i>=1;i--)
{
if(dp[i]==lung_curenta && v[i]<rasp[lung_curenta+1])
{
rasp[lung_curenta]=v[i];
lung_curenta--;
}
}
for(int i=1;i<=lung_max;i++)
fout<<rasp[i]<<' ';
return 0;
}