Pagini recente » Cod sursa (job #321155) | Profil morticia_pain | Cod sursa (job #612704)
Cod sursa(job #612704)
#include <fstream>
#include <vector>
using namespace std;
void find_lis(vector<long> &a, vector<int> &b)
{
vector<int> p(a.size());
long u, v;
if (a.empty()) return;
b.push_back(0);
for (size_t i = 1; i < a.size(); i++)
{
if (a[b.back()] < a[i])
{
p[i] = b.back();
b.push_back(i);
continue;
}
for (u = 0, v = b.size()-1; u < v;)
{
int c = (u + v) / 2;
if (a[b[c]] < a[i]) u=c+1; else v=c;
}
if (a[i] < a[b[u]])
{
if (u > 0) p[i] = b[u-1];
b[u] = i;
}
}
for (u = b.size(), v = b.back(); u--; v = p[v]) b[u] = v;
}
ifstream fi;
ofstream fo;
vector<long> vec;
vector<int> sol;
int main()
{
fi.open("scmax.in");
int n;
fi >> n;
for (int i = 1; i <= n; i++)
{
int val;
fi >> val;
vec.push_back(val);
}
fi.close();
find_lis(vec, sol);
fo.open("scmax.out");
fo << sol.size() << "\n";
for (int i = 0; i < sol.size(); i++)
fo << vec[sol[i]] << " ";
fo.close();
return 0;
}