Pagini recente » Cod sursa (job #3218942) | Cod sursa (job #1098808) | Cod sursa (job #1149487) | Cod sursa (job #746844) | Cod sursa (job #2771153)
#include <iostream>
#include <fstream>
#include <stack>
#include <algorithm>
#include <string>
#include <queue>
#include <vector>
#include <cmath>
//using namespace std;
std::ifstream fin("scmax.in");
std::ofstream fout("scmax.out");
int n;
int v[100005];
int nrMultimi;
int topMultimi[100005];
std::vector<std::pair<int, int>> multimi[100005];
std::pair<int, int> index[100005];
int rez[100005];
int main()
{
fin >> n;
bool ok = true;
for (int i = 1; i <= n; ++i)
{
fin >> v[i];
ok = false;
for (int j = 1; j <= nrMultimi; ++j)
{
if (v[i] <= topMultimi[j])
{
topMultimi[j] = v[i];
if (j >= 2)
index[i] = { j - 1, multimi[j - 1].size() - 1 };
multimi[j].push_back({ v[i], i });
ok = true;
break;
}
}
if (ok == false)
{
if (nrMultimi >= 1)
index[i] = { nrMultimi, multimi[nrMultimi].size() - 1 };
topMultimi[++nrMultimi] = v[i];
multimi[nrMultimi].push_back({ v[i], i });
}
}
/*for (int i = 1; i <= nrMultimi; ++i)
fout << topMultimi[i] << " ";
fout << "\n";
for (int i = 1; i <= nrMultimi; ++i)
{
for (int j = 0; j < multimi[i].size(); ++j)
fout << multimi[i][j] << " ";
fout << "\n";
}*/
//for (int i = 1; i <= 5; ++i)
//fout << index[i].first << " " << index[i].second << "\n";
fout << nrMultimi << "\n";
int current = n;
int ind = 0;
while (index[current].first != 0)
{
//fout << v[current] << " ";
rez[ind++] = v[current];
current = multimi[index[current].first][index[current].second].second;
}
rez[ind++] = v[current];
//fout << v[current];
for (int i = ind - 1; i >= 0; --i)
fout << rez[i] << " ";
return 0;
}