Pagini recente » Cod sursa (job #2319767) | Cod sursa (job #1449676) | Cod sursa (job #198672) | Cod sursa (job #2601722) | Cod sursa (job #2533181)
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 5000
using namespace std;
ifstream fin("subsir2.in");
ofstream fout("subsir2.out");
struct el
{
int info,index;
};
void read(el *v,int &n)
{
fin>>n;
for(int i=0;i<n;++i)
{
fin>>v[i].info;
v[i].index=i;
}
}
void print(el *v,int n)
{
for(int i=0;i<n;++i)
cout<<v[i].info<<' '<<v[i].index<<'\n';
cout<<'\n';
}
bool cmp(el x,el y)
{
return (x.info>y.info);
}
int getPos(el *v,int *best,int n,int val)
{
int l=1,r=n;
while(l<r-1)
{
int m=(l+r)/2;
if(v[best[m]].index>val)
r=m;
else
l=m;
}
if(v[best[l]].index>val)
return r;
return l;
}
int maxLenSeq(el *v,int n,int *final_vec)
{
int best[NMAX],prec[NMAX],k=1,last=0;
best[0]=prec[0]=-1;
best[1]=0;
for(int i=1;i<n;++i)
{
if(v[i].index<v[best[k]].index)
{
//last=i;
best[++k]=i;
prec[i]=best[k-1];
}
else
{
int pos=getPos(v,best,k,v[i].index);
best[pos]=i;
prec[i]=best[pos-1];
}
}
int nr=0;
last=best[k];
while(prec[last]!=-1)
{
final_vec[nr++]=v[last].info;
last=prec[last];
}
final_vec[nr++]=v[last].info;
return nr;
}
int main()
{
el v[NMAX];
int n;
read(v,n);
sort(v,v+n,cmp);
print(v,n);
int res[NMAX],k=maxLenSeq(v,n,res);
fout<<k<<'\n';
for(int i=0;i<k;++i)
fout<<res[i]<<' ';
return 0;
}