Pagini recente » Cod sursa (job #880676) | Cod sursa (job #1049582) | Cod sursa (job #247601) | Cod sursa (job #2555069) | Cod sursa (job #3000223)
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
const int NMAX = 10e5 + 5;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n;
int v[NMAX],ans[NMAX],poz[NMAX];
void citire()
{
f>>n;
for(int i=1;i<=n;i++)
f>>v[i];
}
int binary_search1(int val,int ans_n)
{
int st = 1,dr = ans_n;
int poz = 0;
while(st<=dr)
{
int mij = (st+dr)/2;
if(ans[mij] >= val)
{
poz = mij;
dr = mij-1;
}
if(ans[mij] < val)
{
st = mij+1;
}
}
return poz;
}
void solve()
{
vector<int> rez;
int k = 0;
for(int i=1;i<=n;i++)
{
if(v[i] <= ans[1])
{
ans[1] = v[i];
poz[i] = 1;
}
else if(v[i] > ans[k])
{
ans[++k] = v[i];
poz[i] = k;
}
else
{
int val = binary_search1(v[i],k);
ans[val] = v[i];
poz[i] = val;
}
}
int L = k;
for(int i=n;i>=1 && L;i--)
{
if(poz[i] == L)
{
L--;
rez.push_back(v[i]);
}
}
g<<rez.size()<<"\n";
for(int i=rez.size()-1;i>=0;i--)
g<<rez[i]<<" ";
}
int main()
{
citire();
solve();
}