Pagini recente » Cod sursa (job #643364) | Cod sursa (job #546669) | Cod sursa (job #510656) | Cod sursa (job #2057924) | Cod sursa (job #1825165)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int v[100001],last[100001],q[100001],vf;
void adaug(int i)
{
int st,dr,mij;
if(vf==1)
{
if(v[q[1]]>v[i])
{
q[1]=i;
}
else
{
q[2]=i;
vf=2;
last[i]=q[1];
}
return ;
}
st=1;dr=vf;
while(st<dr)
{
mij=st+dr;mij=mij/2;
if(v[q[mij]]>v[i])
{
if(mij==dr)
dr--;
else
dr=mij;
}
else
{
if(v[q[mij]]==v[i])
{
last[i]=last[q[mij]];
return ;
}
else
{
if(mij==st)
st++;
else
st=mij;
}
}
}
if(dr==vf && v[q[vf]]<v[i])
{
q[++vf]=i;
last[i]=q[vf-1];
return ;
}
if(v[q[st]]<v[i])
return ;
q[st]=i;
last[i]=q[st-1];
}
void afisare(int var)
{
if(last[var]!=0)
afisare(last[var]);
fout<<v[var]<<' ';
}
int main()
{
int n,i,var;
fin>>n;
fin>>v[1];
q[1]=1;vf=1;last[1]=0;
for(i=2;i<=n;i++)
{
fin>>v[i];
adaug(i);
}
fout<<vf<<'\n';
var=q[vf];
afisare(var);
return 0;
}