Pagini recente » Cod sursa (job #74333) | Cod sursa (job #2512532) | Cod sursa (job #714577) | Cod sursa (job #2978100) | Cod sursa (job #2736070)
#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 = 0;
int v[100100], father[100100], best[100100];
stack<int> s;
int binarySearch(int val)
{
int left = 1, right = ans;
while(left < right)
{
int mid = left + (right - left) / 2;
if(v[best[mid]] >= val)
right = mid;
else
left = mid + 1;
}
return left;
}
int main()
{
in >> n;
for(int i = 1; i <= n; i++)
in >> v[i];
for(int i = 1; i <= n; i++)
{
/*
for(int i = 1; i <= n; i++)
cout << best[i] << ' ';
cout << '\n';
*/
if(v[i] > v[best[ans]])
{
ans++;
best[ans] = i;
father[i] = best[ans - 1];
//cout << "IF: " << v[i] << ' ' << ans << ' ' << best[ans] << '\n';
}
else
{
int x = binarySearch(v[i]);
best[x] = i;
father[i] = best[x - 1];
//cout << "ELSE: " << v[i] << ' ' << x << ' ' << father[i] << '\n';
}
}
out << ans << '\n';
int i = best[ans];
while(i != 0)
{
// cout << i << ' ' << father[i] << '\n';
s.push(v[i]);
i = father[i];
}
while(!s.empty())
{
out << s.top() << ' ';
s.pop();
}
return 0;
}