Pagini recente » Cod sursa (job #714899) | Cod sursa (job #379856) | Cod sursa (job #665918) | Cod sursa (job #2498567) | Cod sursa (job #2736049)
#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 - 1;
while(left < right)
{
int mid = (left + right) / 2;
//cout << left << ' ' << right << ' ' << mid << '\n';
if(v[best[mid]] <= val)
left = mid + 1;
else
right = mid;
}
//cout << val << ' ' << right << '\n';
return right;
}
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] << ' ';
// << '\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]) + 1;
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;
}