Pagini recente » Cod sursa (job #558187) | Cod sursa (job #728365) | Cod sursa (job #2929763) | Cod sursa (job #3143059) | Cod sursa (job #531615)
Cod sursa(job #531615)
#include<fstream>
#define DIM 100003
using namespace std;
int father[DIM],l[DIM],v1[DIM],n,cresc1[DIM],poz,maxim;
void cauta(int st,int dr,int val,int v[]);
void subsir_crescator(int v[],int cresc[]);
ofstream fout("scmax.out");
void inter();
int main()
{
ifstream fin("scmax.in");
fin>>n;
int i;
for(i=1;i<=n;i++)
fin>>v1[i];
v1[0]=n;
subsir_crescator(v1,cresc1);
fout<<cresc1[0]<<"\n";
for(i=1;i<=cresc1[0];i++)
fout<<v1[cresc1[i]]<<" ";
return 0;
}
void subsir_crescator(int v[],int cresc[])
{
int nr=1;
l[1]=1;
int i;
for(i=2;i<=n;i++)
{
poz=0;
cauta(1,nr,v[i],v);
father[i]=l[poz];
if(l[poz+1]==0)
l[poz+1]=i;
if(v[l[poz+1]]>v[i])
l[poz+1]=i;
if(poz+1>nr)
nr=poz+1;
}
cresc[0]=nr;
cresc[nr]=l[nr];
int bau=l[nr];
nr--;
while(nr>0)
{
cresc[nr]=father[bau];
bau=father[bau];
nr--;
}
}
void cauta(int st,int dr,int val,int v[])
{
if(st==dr)
{
if(st>poz && v[l[st]]<val)
poz=st;
return ;
}
else
{
int mij=(st+dr)/2;
if(v[l[mij]]<val)
{
if(mij>poz)
poz=mij;
cauta(mij+1,dr,val,v);
}
else
cauta(st,mij,val,v);
}
}