Pagini recente » Cod sursa (job #1897690) | Cod sursa (job #813582) | Cod sursa (job #3229500) | Cod sursa (job #1679287) | Cod sursa (job #3277443)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("scmax.in");
ofstream g ("scmax.out");
const int NMAX = 100001;
int v[NMAX],
best[NMAX], ///best[i] indicele ultimului element din cel mai bun subsir de lungime i
parent[NMAX],
lg[NMAX],
lgmax;
int cautBest (int nr) ///cautam lungimea celui mai lung subsir la care putem alipi
{
int p = 0, u = lgmax, ans = -1;
while (p <= u)
{
int mid = (p + u) / 2;
if (v[best[mid]] < nr)
{
ans = mid;
p = mid + 1;
}
else
{
u = mid - 1;
}
}
return ans;
}
void printSubsir (int i)
{
if (i == 0)
{
return;
}
printSubsir (parent[i]);
g << v[i] << ' ';
}
int main()
{
int n, idxLongest = 1;
f >> n;
for (int i = 1; i <= n; i++)
{
f >> v[i];
int lgCrt = cautBest (v[i]);
if (lgCrt + 1 > lgmax)
{
lgmax = lgCrt + 1;
idxLongest = i;
}
best[lgCrt + 1] = i;
parent[i] = best[lgCrt];
}
g << lgmax << '\n';
printSubsir (idxLongest);
return 0;
}