Pagini recente » Cod sursa (job #1403660) | Cod sursa (job #2865477) | Cod sursa (job #846145) | Cod sursa (job #2076209) | Cod sursa (job #1595875)
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 100000 + 1;
int finalKeys[MAX_N];
vector<int> subsequences[MAX_N];
int A[MAX_N];
int N, numberSubseqs;
int binSearch(int key)
{
int l = 1, r = numberSubseqs;
int ans = numberSubseqs + 1;
while (l <= r)
{
int m = (l + r) / 2;
if (finalKeys[m] >= key)
{
l = m + 1;
}
else
{
ans = m;
r = m - 1;
}
}
return ans;
}
int main()
{
ifstream in("scmax.in");
ofstream out("scmax.out");
in >> N;
for (int i = 1; i <= N; ++i)
in >> A[i];
for (int i = 1; i <= N; ++i)
{
int p = binSearch(A[i]);
if (p > numberSubseqs)
{
numberSubseqs++;
finalKeys[numberSubseqs] = A[i];
subsequences[numberSubseqs].emplace_back(A[i]);
}
else
{
if (subsequences[p].size() == 0)
throw "empty subseq";
if (subsequences[p].back() != A[i])
subsequences[p].emplace_back(A[i]);
finalKeys[p] = A[i];
}
}
int best = 0;
int ind = 0;
for (int i = 1; i <= numberSubseqs; ++i)
{
if ((int)subsequences[i].size() > best)
{
best = subsequences[i].size();
ind = i;
}
}
out << best << "\n";
for (int x : subsequences[ind])
out << x << " ";
out << "\n";
return 0;
}