Pagini recente » Cod sursa (job #2715299) | Cod sursa (job #1963803) | Cod sursa (job #1939326) | Cod sursa (job #2760616) | Cod sursa (job #2735761)
#include <iostream>
#include <fstream>
#include <cstring>
#include <stack>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int INF = 0x3f3f3f3f3f3f3f3f;
int n, ans = -1;
int v[100100], father[100100];
stack<int> s;
pair<int, int> best[100100];
int binarySearch(int val)
{
int left = 1, right = n;
while(left < right)
{
int mid = (left + right) / 2;
if(best[mid].first < val)
left = mid + 1;
else
right = mid;
}
return right;
}
int main()
{
memset(best, INF, sizeof best);
in >> n;
for(int i = 1; i <= n; i++)
in >> v[i];
for(int i = 1; i <= n; i++)
{
int x = binarySearch(v[i]);
best[x] = make_pair(v[i], i);
if(x == 1)
father[i] = -1;
else
father[i] = best[x - 1].second;
ans = max(ans, x);
}
out << ans << '\n';
for(int i = best[ans].second; i != -1; i = father[i])
s.push(v[i]);
while(!s.empty())
{
out << s.top() << ' ';
s.pop();
}
out << '\n';
return 0;
}