Pagini recente » Cod sursa (job #2784811) | Cod sursa (job #1587421) | Cod sursa (job #2730195) | Cod sursa (job #267230) | Cod sursa (job #2505592)
#include <iostream>
#include <fstream>
#include <utility>
#include <algorithm>
#define DEBUG 0
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int tree[100001];
pair<int, int> v[100001], rez[100001];
int n;
int query(int poz)
{
int s = 0;
for(int i = poz; i; i -= i&-i)
s = max(s, tree[i]);
return s;
}
void update(int poz, int val)
{
for(int i = poz; i <= n; i += i&-i)
tree[i] = max(val, tree[i]);
}
bool comp(pair<int, int> x, pair<int, int> y)
{
if(x.first == y.first)
return(x.second > y.second);
return(x.first < y.first);
}
int main()
{
in >> n;
for(int i = 1; i <= n; i++)
{
in >> v[i].first;
v[i].second = i;
}
sort(v+1, v+n+1, comp);
if(DEBUG)
for(int i = 1; i <= n; i++)
cout << v[i].first << ' ' << v[i].second << '\n';
int k = 0;
for(int i = 1; i <= n; i++)
{
int nr = query(v[i].second-1);
update(v[i].second, nr+1);
if(DEBUG)
{
cout << nr << '\n' << v[i].first << ' ' << v[i].second << "\n\n";
}
if(k == 0)
rez[k++] = v[i];
else
if(rez[k-1].second < v[i].second)
rez[k++] = v[i];
}
out << query(n) << '\n';
for(int i = 0; i < k; i++)
out << rez[i].first << ' ';
return 0;
}