Pagini recente » Cod sursa (job #1166850) | Cod sursa (job #2049497) | Cod sursa (job #1781577) | Cod sursa (job #2276416) | Cod sursa (job #364459)
Cod sursa(job #364459)
//subsir crescator maximal cu AIB
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
#define nm 100005
#define lsb(x)(((x)^(x-1))&(x))
#define pb push_back
int A[nm],AIB[nm],DAIB,N,B[nm],W[nm];
vector<int> nrml;
int query(int poz)
{
int ans=0;
while(poz)
{
ans=max(ans,AIB[poz]);
poz-=lsb(poz);
}
return ans;
}
void update(int poz,int val)
{
while(poz<=DAIB)
{
AIB[poz]=max(AIB[poz],val);
poz+=lsb(poz);
}
}
int main()
{
int best=0;
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&N);
for(int i=1;i<=N;++i)
{
scanf("%d",&A[i]);
nrml.pb(A[i]);
}
//trebuie normalizat
nrml.pb(-1);
sort(nrml.begin(),nrml.end());
DAIB=0;
for(int i=1;i<=N;++i)
if(nrml[i]!=nrml[i-1])
{
++DAIB;
W[nrml[i]]=DAIB;
}
for(int i=1;i<=N;++i)
{
B[i]=query(W[A[i]]-1)+1;
update(W[A[i]],B[i]);
if(B[i]>best) best=B[i];
}
int mm=2000000001,ce=best;
for(int i=N;i>=1 && ce;--i)
if(B[i]==ce && A[i]<mm)
{
W[ce]=A[i];
--ce;
mm=A[i];
}
printf("%d\n",best);
for(int i=1;i<=best;++i)
printf("%d ",W[i]);
return 0;
}