Pagini recente » Cod sursa (job #460165) | Cod sursa (job #127173) | Autentificare | Cod sursa (job #3193610) | Cod sursa (job #2870711)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ifstream in("scmax.in");
ofstream out("scmax.out");
const int N=1e5;
int v[N+5],p[N+5];
int cb(vector <int> a, int x)
{
int st=1,dr=a.size()-1,mij;
//poz celui mai mic el din a care este mai mare decat x
// => pozitia minima
while(st<dr)
{
mij=st+(dr-st)/2;
if(a[mij]<x)
st=mij+1;
else
dr=mij;
}
mij=st+(dr-st)/2;
if(a[mij] < x)
mij++;
return mij;
}
int main()
{
int n; in>>n;
for(int i=1; i<=n; i++) in>>v[i];
vector<int> d;
d.push_back(0);
d.push_back(v[1]);
p[1]=1;
for(int i=2; i<=n; i++)
{
if(v[i] > d[d.size()-1])
{
d.push_back(v[i]);
p[i]=d.size()-1;
}
else
{
int poz=cb(d,v[i]);
d[poz]=v[i];
p[i]=poz;
}
}
int poz=n;
vector<int> sol;
for(int i=d.size()-1;i>=1;i--)
{
while(p[poz] != i) poz--;
sol.push_back(poz);
}
out<<d.size()-1<<'\n';
for(int i=sol.size()-1;i>=0;i--) out<<v[sol[i]]<<' ';
return 0;
}