Pagini recente » Cod sursa (job #2186512) | Cod sursa (job #424965) | Cod sursa (job #2145673) | Cod sursa (job #2415191) | Cod sursa (job #2129715)
#include <algorithm>
#include <fstream>
#include <vector>
using namespace std;
const int DIM = 100010;
int n;
int v[DIM], minim[DIM], pos[DIM];
int dim = 1;
vector <int> sol;
void Read()
{
ifstream fin("scmax.in");
fin >> n;
for (int i = 1;i <= n;++i)
fin >> v[i];
fin.close();
}
int BinarySearch(int x)
{
if (minim[1] == 0)
return 1;
if (x > minim[dim])
return ++dim;
int left = 1, right = dim, mid, pos;
while (left <= right)
{
mid = (left + right) / 2;
if (minim[mid] >= x)
{
pos = mid;
right = mid - 1;
}
else
left = mid + 1;
}
return pos;
}
void Solve()
{
int p;
for (int i = 1;i <= n;++i)
{
p = BinarySearch(v[i]);
minim[p] = v[i];
pos[i] = p;
}
int x = dim;
int pred = 2000000001;
for (int i = n;i >= 1;--i)
{
if (x == pos[i] && pred > v[i])
{
sol.push_back(v[i]);
--x;
}
}
reverse(sol.begin(), sol.end());
}
void Write()
{
ofstream fout("scmax.out");
fout << dim << "\n";
for (vector <int> ::iterator it = sol.begin();it != sol.end();++it)
fout << *it << " ";
fout.close();
}
int main()
{
Read();
Solve();
Write();
return 0;
}