Pagini recente » Cod sursa (job #1466633) | Cod sursa (job #2983600) | Cod sursa (job #1163990) | Cod sursa (job #846446) | Cod sursa (job #1142245)
#include<fstream>
#include<algorithm>
#define N 100100
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
struct el{int por,psr,val; } v[N];
int cre(el a,el b){ return a.val<b.val; }
int ori(el a,el b){ return a.por<b.por; }
int come[N],sol[N],poz,len[N],ma,i,t,n,pma,gr,A[N],P[N];
void find(int po)
{
for(;po;po-=po&-po)
if(A[po]>ma)
{
ma=A[po];
poz=P[po];
}
}
void upd(int po,int val)
{
for(;po<=n;po+=po&-po)
if(val>A[po])
{
A[po]=val;
P[po]=i;
}
}
int main ()
{
f>>n;
for(i=1;i<=n;++i)
{
v[i].por=i;
f>>v[i].val;
}
sort(v+1,v+n+1,cre);
for(i=1;i<=n;++i)
{
++t;
while(v[i].val==v[i+1].val)
{
v[i].psr=t;
i++;
}
v[i].psr=t;
}
sort(v+1,v+n+1,ori);
for(i=1;i<=n;++i)
{
ma=0;
find(v[i].psr-1);
len[i]=ma+1;
come[i]=poz;
upd(v[i].psr,len[i]);
if(len[i]>gr)
{
gr=len[i];
pma=i;
}
}
ma=gr;
g<<ma<<"\n";
gr=ma;
sol[ma]=v[pma].val;
while(ma)
{
ma--;
pma=come[pma];
sol[ma]=v[pma].val;
}
for(i=1;i<=gr;++i)
g<<sol[i]<<" ";
return 0;
}