Pagini recente » Cod sursa (job #75176) | Cod sursa (job #136329) | Cod sursa (job #929614) | Cod sursa (job #2090950) | Cod sursa (job #2035917)
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int maxn = 100005;
vector <int> sol;
int M[maxn];
int F[maxn];
int v[maxn];
int cautbin(int n, int i)
{
int st = 1;
int dr = n;
int ret = 0;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(v[M[mij]] < v[i])
{
ret = mij;
st = mij + 1;
}
else
dr = mij - 1;
}
return ret + 1;
}
int main()
{
int n;
in >> n;
for(int i = 1; i <= n; i++)
in >> v[i];
int lgmax = 0;
for(int i = 1; i <= n; i++)
{
int lg = cautbin(lgmax, i);
F[i] = M[lg - 1];
M[lg] = i;
lgmax = max(lg, lgmax);
}
out << lgmax << " " << "\n";
int p = M[lgmax];
while(p > 0)
{
sol.push_back(p);
p = F[p];
}
reverse(sol.begin(), sol.end());
for(auto it : sol)
out << v[it] << " ";
out << "\n";
return 0;
}