Pagini recente » Istoria paginii runda/dau_pentru_aluprej | Cod sursa (job #2542570) | Cod sursa (job #2110300) | Cod sursa (job #1754412) | Cod sursa (job #1415093)
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
ifstream in("sume.in");
ofstream out("sume.out");
int *v,*res,*lst,*d,*aib,*up,bst,n,i,h=1;
void update(int x, int ind)
{
for(;x;x+=x^(x-1)&x)
if(d[ind]>d[aib[x]])
aib[x]=ind;
}
int query(int x)
{
int mx=0;
for(; x; x -= x^(x-1) & x)
if(d[aib[x]]>d[mx])
mx=aib[x];
return mx;
}
int main()
{
in>>n;
v=new int[n];
res=new int[n];
lst=new int[n];
d=new int[n];
aib=new int[n];
up=new int[n];
for(i=0;i<=n;++i)
{
in>>v[i];
res[i]=lst[i]=v[i];
}
sort(lst+1,lst+n+1);
for(i=2;i<=n;++i)
if(lst[i]!=lst[h])
lst[++h]=lst[i];
for(i=1;i<=n;++i)
v[i]=lower_bound(lst+1,lst+h+1,v[i])-lst;
for(i=1;i<=n;++i)
{
up[i]=query(v[i]-1);
d[i]=d[up[i]]+1;
update(v[i],i);
}
for(i=1;i<=n;++i)
if(d[bst]<d[i])
bst=i;
for(h=0,i=bst;i;i=up[i])
lst[++h]=res[i];
for(i=h;i;i--)
cout<<lst[i]<<" ";
in.close();
out.close();
return 0;
}