Pagini recente » Cod sursa (job #410726) | Cod sursa (job #383939) | Cod sursa (job #2748083) | Cod sursa (job #1948766) | Cod sursa (job #3304475)
#include <fstream>
#include <vector>
using namespace std;
int binarySearch(vector<pair<long long, int>>::iterator begin, vector<pair<long long, int>>::iterator end, long long x)
{
int left = 0, right = end - begin - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if ((begin + mid)->first < x)
left = mid + 1;
else
right = mid - 1;
}
if (left < end - begin)
return left;
return -1;
}
int main()
{
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n;
vector<long long> v, dp;
vector<pair<long long, int>> tails;
vector<int> indices;
fin >> n;
for (int i = 0; i < n; ++i)
{
long long x;
fin >> x;
v.push_back(x);
}
dp.resize(n + 1, 0);
tails.push_back(make_pair(v[0], 0));
dp[0] = 1;
indices.push_back(-1);
for (int i = 1; i < n; ++i)
{
long long x = v[i];
int position = binarySearch(tails.begin(), tails.end(), x);
if (position == -1)
{
tails.push_back(make_pair(x, i));
dp[i] = tails.size();
indices.push_back(tails[tails.size() - 2].second);
}
else
{
tails[position] = make_pair(x, i);
dp[i] = position + 1;
if (position == 0)
indices.push_back(-1);
else
indices.push_back(tails[position - 1].second);
}
}
int max = -1;
int maxi = -1;
for (int i = 0; i < n; ++i)
{
if (dp[i] > max)
{
maxi = i;
max = dp[i];
}
}
fout << max << endl;
vector <long long> result;
for (int i = maxi; i >= 0; i = indices[i])
{
result.push_back(v[i]);
}
for (auto it = result.rbegin(); it != result.rend(); ++it)
{
fout << *it << " ";
}
return 0;
}