Pagini recente » Cod sursa (job #576718) | Cod sursa (job #2785166) | Cod sursa (job #1249950) | Cod sursa (job #2217853) | Cod sursa (job #1750505)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
struct inaib
{
int val,poz;
}aib[100010];
vector<int> norm;
int v[100010],sol[100010],d[100010],tata[100010],n;
int poz_norm(int x)
{
return lower_bound(norm.begin(),norm.end(),x)-norm.begin()+1;
}
void aib_update(int i,int val,int poz)
{
for(;i<=n;i+=i&(-i))
if(val>aib[i].val) aib[i]={val,poz};
}
int aib_query(int i)
{
int val=0,poz=0;
for(;i>=1;i-=i&(-i))
if(aib[i].val>val) {val=aib[i].val;poz=aib[i].poz;}
return poz;
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int maxx=0,poz=0,nr=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&v[i]);
norm.push_back(v[i]);
}
sort(norm.begin(),norm.end());
for(int i=1;i<=n;i++)
{
int x=poz_norm(v[i]);
int poz=aib_query(x-1);
d[i]=d[poz]+1;
tata[i]=poz;
aib_update(x,d[i],i);
}
for(int i=1;i<=n;i++)
if(d[i]>maxx) {maxx=d[i];poz=i;}
for(int i=poz;i>0;i=tata[i]) sol[++nr]=v[i];
printf("%d\n",nr);
for(int i=nr;i;i--) printf("%d ",sol[i]);
return 0;
}