Pagini recente » Cod sursa (job #2891022) | Cod sursa (job #1800264) | Borderou de evaluare (job #2332912) | Borderou de evaluare (job #1159891) | Cod sursa (job #2662459)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int a[100005], n, k, lMax[100005];
int bestLog = 1;
vector<int> v;
int getLog(int lung)
{
while(bestLog<lung)
bestLog<<=1;
return bestLog;
}
int binarySearch(int nr)
{
int j = -1;
int log = getLog(v.size());
for(; log; log>>=1)
if(j + log < v.size() && v[j+log] < nr)
j+=log;
return j+1;
}
void read()
{
f>>n;
for(int i = 0; i<n; i++)
{
f>>a[i];
int poz = binarySearch(a[i]);
lMax[i] = poz;
if(poz >= v.size())
v.push_back(a[i]);
else
v[poz] = a[i];
}
}
void print()
{
vector<int> sol;
int maxim = v.size()-1;
for(int i = n-1; i>=0; i--)
{
if(maxim == lMax[i])
{
sol.push_back(a[i]);
maxim--;
}
}
g<<sol.size()<<"\n";
for(auto itr = sol.rbegin(); itr != sol.rend(); ++itr)
{
g<<*itr<<" ";
}
}
int main()
{
read();
print();
return 0;
}