Pagini recente » Diferente pentru problema/pachete intre reviziile 12 si 7 | Cod sursa (job #2663354) | Cod sursa (job #1558150) | Cod sursa (job #2442302) | Cod sursa (job #1182025)
#include <fstream>
#include <map>
#include <vector>
#include <algorithm>
#include <utility>
#include <iterator>
using namespace std;
const int MAXN = 100001;
map<int, int> m;
vector<int> v, LIS;
int parent[MAXN];
void read()
{
ifstream fin("scmax.in");
int n, x;
fin>>n;
for (int i=0; i<n; ++i)
{
fin>>x;
v.push_back(x);
}
}
void solve()
{
for (int i=0; i<v.size(); ++i)
{
map<int,int>::iterator it, pred, succ;
it = m.find(v[i]);
if (it != m.end())
continue;
m.insert(make_pair(v[i], i));
it = m.find(v[i]);
//GASESTE PREDECESORUL SI SUCCESORUL O(map.size())
pred = prev(it);
succ = next(it);
//ELIMINAM CANDIDATUL MAI PROST
if (succ != m.end())
m.erase(succ);
//DACA E SINGUR IN LISTA PARINTELE E -1
if (it == m.begin())
parent[it->second] = -1;
else
parent[it->second] = pred->second;
}
//CONSTRUIESTE LISTA: ULTIMUL EL DIN MAP
//O SA FIE SFARSITUL LIS-ULUI
int p = m.rbegin()->second;
while (p!=-1)
{
LIS.push_back(p);
p = parent[p];
}
}
void write()
{
ofstream fout("scmax.out");
fout<<LIS.size()<<'\n';
for (int i=LIS.size()-1; i>=0; --i)
fout<<v[LIS[i]]<<' ';
fout<<'\n';
}
int main()
{
read();
solve();
write();
return 0;
}