Pagini recente » Cod sursa (job #2884493) | Cod sursa (job #3196751) | Cod sursa (job #1871669) | Cod sursa (job #2832980) | Cod sursa (job #1938405)
#include <fstream>
#include<vector>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
vector<int> arb,v,l,pre;
int b,a,c,maxim,n,M,k;
void Update(int nod,int st,int dr)
{
if(st==dr)
{
arb[nod]=b+1;
return ;
}
int mij=(st+dr)/2;
if(b+1<=mij) Update(2*nod,st,mij);
else Update(2*nod+1,mij+1,dr);
if(v[arb[2*nod]]>v[arb[2*nod+1]]) arb[nod]=arb[2*nod];
else arb[nod]=arb[2*nod+1];
}
void best(int nod,int st,int dr)
{
int mij=(st+dr)/2;
if(st>=a && dr<=b)
{if(v[arb[nod]]<c)
{
if(l[arb[nod]]>l[maxim]) maxim=arb[nod];
return ;
}
if(st==dr) return ;}
if(mij>=a) best(2*nod,st,mij);
if(mij+1<=b) best(2*nod+1,mij+1,dr);
}
void afiseaza(int k)
{
if(pre[k]) afiseaza(pre[k]);
g<<v[k]<<' ';
}
int main()
{
f>>n;
arb.resize(2*n);
v.resize(n+1);
l.resize(n+1);
pre.resize(n+1);
for(int i=1; i<=n; i++)
{
f>>v[i];
a=1;
b=i-1;
c=v[i];
maxim=0;
if(i>1) best(1,1,n);
l[i]=l[maxim]+1;
pre[i]=maxim;
Update(1,1,n);
if(M<l[i])
{
M=l[i];
k=i;
}
}
g<<M<<'\n';
afiseaza(k);
return 0;
}