Pagini recente » Cod sursa (job #3162884) | Cod sursa (job #19493) | Cod sursa (job #959703) | Cod sursa (job #1890730) | Cod sursa (job #2260988)
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
ifstream fin("sclmprime.in");
ofstream fout("sclmprime.out");
inline bool prime(int x)
{
if ((x % 2 == 0 && x != 2) || x < 2)
return 0;
for (int i = 3; i * i <= x; i += 2)
if (x % i == 0)
return 0;
return 1;
}
int upperBound(const vector<int> &v, const vector<int> &ind,
int val, int st, int dr)
{
while (st <= dr)
{
int mij = (st + dr) / 2;
if (val > v[ ind[mij] ])
st = mij + 1;
else
dr = mij - 1;
}
return st;
}
void getLIS(const vector<int> &v)
{
/// getting LIS
vector<int> ind(v.size(),0);
vector<int> prev(v.size(), -1);
int len = 0;
for (int i = 0; i < v.size(); ++i)
{
int pos = upperBound(v, ind, v[i], 0, len);
if (pos > 0)
prev[i] = ind[pos - 1];
ind[pos] = i;
len = max(len, pos);
}
fout << len + 1 << '\n';
/// printing LIS
stack<int> print;
for (int i = ind[len]; i >= 0; i = prev[i])
print.push(v[i]);
for (; !print.empty(); print.pop())
fout << print.top() << ' ';
}
int main()
{
int n;
fin >> n;
vector<int> v;
for (int x, i = 0; i < n; ++i)
{
fin >> x;
//if (prime(x))
v.emplace_back(x);
}
getLIS(v);
}