Pagini recente » Cod sursa (job #3342113) | Cod sursa (job #1287938) | Cod sursa (job #3346615) | Cod sursa (job #1502612) | Cod sursa (job #3309781)
#include <bits/stdc++.h>
#define NMAX 100001
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int a[NMAX];
int dp[NMAX], ult_poz[NMAX];
int cautare_binara(int val, int n)
{
int st=0, dr=n, poz=0;
while(st<=dr)
{
int mij=st+(dr-st)/2;
if(a[dp[mij]]<val)
{
poz=mij;
st=mij+1;
}
else
{
dr=mij-1;
}
}
return poz+1;
}
int main()
{
int n;
in >> n;
for(int i=1; i<=n; i++)
{
in >> a[i];
}
int l_max=0, poz_lmax=0; ///lungimea maxima si pozitia din vectorul a a ultimului element adaugat
for(int i=1; i<=n; i++)
{
if(a[dp[l_max]]<a[i])
{
ult_poz[i]=dp[l_max];
dp[++l_max]=i;
poz_lmax=i;
}
else
{
int poz=cautare_binara(a[i], l_max);
dp[poz]=i;
ult_poz[i]=dp[poz-1];
}
}
out << l_max << "\n";
vector<int> lis; ///subsirul cerut
while(poz_lmax!=0)
{
lis.push_back(poz_lmax);
poz_lmax=ult_poz[poz_lmax];
}
reverse(lis.begin(), lis.end());
for(auto& i : lis) ///afisam subsirul
out << a[i] << " "; out << "\n";
return 0;
}