Pagini recente » Cod sursa (job #2136762) | Cod sursa (job #1977700) | Cod sursa (job #2490726) | Cod sursa (job #2452027) | Cod sursa (job #280912)
Cod sursa(job #280912)
#include<fstream.h>
#define xx 100001
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int h[5*xx],v[xx],l[xx],n,poz,a,b,max;
void creare_arb(int nd,int li,int ls)
{
if(li==ls)
{
h[nd]=poz;
return;
}
int mij=(li+ls)/2;
if(poz<=mij)
creare_arb(2*nd,li,mij);
else
creare_arb(2*nd+1,mij+1,ls);
h[nd]=(l[h[2*nd]]>l[h[2*nd+1]] ? h[2*nd] : h[2*nd+1]);
}
void interogare(int nd,int li,int ls)
{
if(a<=li && ls<=b)
{
if(v[poz]<v[h[nd]] && max<l[h[nd]])
max=l[h[nd]];
}
if(li==ls) return;
int mij=(li+ls)/2;
if(a<=mij)
interogare(2*nd,li,mij);
if(mij<b)
interogare(2*nd+1,mij+1,ls);
}
int main()
{
int maxx=1;
int i;
fin>>n;
for(i=1;i<=n;i++)
fin>>v[i];
l[n]=1;
poz=n;
creare_arb(1,1,n);
for(i=n-1;i>0;i--)
{
poz=i;
max=0;
a=i+1;
b=n;
interogare(1,1,n);
l[i]=1+max;
creare_arb(1,1,n);
if(maxx<l[i])
maxx=l[i];
}
fout<<maxx<<'\n';
for(i=1;i<=n;i++)
if(l[i]==maxx)
fout<<v[i]<<' ',maxx--;
fout<<'\n';
fout.close();
return 0;
}