Pagini recente » Cod sursa (job #3154609) | Cod sursa (job #1313271) | Cod sursa (job #650077) | Cod sursa (job #100585) | Cod sursa (job #1510234)
#include <cstdio>
#include <algorithm>
FILE *fin,*fout;
struct myaib
{
int val,pos;
myaib(int x=0,int y=0){val=x;pos=y;}
}aib[100001],arr[100001];
int order[100001],v[100001],maxx,poz,solve[100001];
int n,nr;
int cauta(int x)
{
return std::lower_bound(order+1,order+1+n,x)-order;
}
myaib query(int i)
{
myaib res;
for(;i>0;i-=i&(-i))
{
if(aib[i].val>res.val)
{
res=aib[i];
}
}
return res;
}
void update(int x,int pos,int i)
{
for(;i<=n;i+=i&(-i))
{
if(x>aib[i].val)
{
aib[i]=myaib(x,pos);
}
}
}
int main()
{
fin=fopen("scmax.in","r");
fout=fopen("scmax.out","w");
fscanf(fin,"%d",&n);
for(int i=1;i<=n;i++)
{
fscanf(fin,"%d",&v[i]);
order[i]=v[i];
}
std::sort(order+1,order+1+n);
for(int i=1;i<=n;i++)
{
arr[i]=query(cauta(v[i])-1);
arr[i].val++;
update(arr[i].val,i,cauta(v[i]));
if(arr[i].val>maxx)
{
poz=i;
maxx=arr[i].val;
}
}
for(int i=poz;i>0;i=arr[i].pos)
{
nr++;
solve[nr]=v[i];
}
fprintf(fout,"%d\n",nr);
for(int i=nr;i;i--)
{
fprintf(fout,"%d ",solve[i]);
}
}