Pagini recente » Cod sursa (job #904554) | Cod sursa (job #125595) | Cod sursa (job #1546491) | Profil alexandrapopoiu | Cod sursa (job #1442746)
// Subsir crescator maximal - complexitate O (nlogn) - cu cautare binara
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
int n, a[100010], minim[100010], poz[100010], sol, v[100010], nv;
// minim[i] = valoarea minima cu care se poate termina un subsir de lungime i
// poz[i] = pozitia din vectorul minim gasita in urma cautarii binare pentru elementul a[i]
inline void Read()
{
ifstream f("scmax.in");
f>>n;
int i;
for (i=1; i<=n; i++)
f>>a[i];
f.close();
}
inline void Solve()
{
int i, p;
for (i=1; i<=n; i++)
{
p = upper_bound(minim+1, minim+sol+1, a[i]) - minim;
if (minim[p-1] == a[i])
p--;
minim[p] = a[i];
poz[i] = p;
if (p>sol)
sol = p;
}
}
inline void Write()
{
ofstream g("scmax.out");
g<<sol<<"\n";
int i, lg = sol;
for (i=n; i; i--)
{
if (poz[i] == lg)
{
v[++nv] = a[i];
lg--;
}
}
for (i=nv; i; i--)
g<<v[i]<<" ";
g<<"\n";
g.close();
}
int main()
{
Read();
Solve();
Write();
return 0;
}