Pagini recente » Cod sursa (job #2137886) | Cod sursa (job #15991) | Cod sursa (job #1362370) | Cod sursa (job #1098283) | Cod sursa (job #1864942)
#include<fstream>
#include<stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX=100001;
int v[NMAX],Q[NMAX],P[NMAX],n,k;
void citire()
{
fin>>n;
for(int i=1;i<=n;++i)
fin>>v[i];
}
int div_et_imp(int st,int dr,int nr)
{
int mij=(st+dr)/2;
if(st==dr)
{
if(dr>k)
Q[++k+1]=2000000000;
Q[dr]=nr;
return st;
}
else if(nr<=Q[mij])
return div_et_imp(st,mij,nr);
else
return div_et_imp(mij+1,dr,nr);
}
void subsir()
{
Q[1]=2000000000;
for(int i=1;i<=n;++i)
P[i]=div_et_imp(1,k+1,v[i]);
}
void constr()
{
stack<int>s;
for(int i=n;i>=1;--i)
if(P[i]==k)
{
s.push(i);
--k;
}
while(s.empty()==false)
{
fout<<v[s.top()]<<' ';
s.pop();
}
}
int main()
{
citire();
subsir();
fout<<k<<'\n';
constr();
}