Pagini recente » Cod sursa (job #111753) | Cod sursa (job #1341432) | Cod sursa (job #1387024) | Cod sursa (job #1471837) | Cod sursa (job #2121656)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
#define lim 100010
int n, ini[lim], rez, pos;
int dp[lim], dad[lim]; /// dp[i] = indicele el. care e capatul scmax de lungime i
/// returneaza cea mai din dr pos pt care ini[dp[pos]] < ini[x]
int b_s (int x)
{
int pos, mask;
for (mask=1; mask<=x; mask<<=1);
for (pos=0; mask>0; mask>>=1)
if (pos+mask<=x)
if (ini[dp[pos+mask]] < ini[x]) pos+=mask;
return pos;
}
void drum (int x)
{
if (dad[x]) drum (dad[x]);
fout<<ini[x]<<' ';
}
int main()
{
fin>>n;
for (int i=1; i<=n; i++) fin>>ini[i];
ini[0]=2e9;
for (int i=1; i<=n; i++)
{
pos = b_s (i);
rez = max (rez, pos+1);
dp[pos+1] = i;
dad[i] = dp[pos];
}
fout<<rez<<'\n';
drum (dp[rez]);
fout.close();
return 0;
}