Pagini recente » Cod sursa (job #1994248) | Cod sursa (job #2660933) | Cod sursa (job #1005872) | Cod sursa (job #1480659) | Cod sursa (job #672663)
Cod sursa(job #672663)
#include<cstdio>
#include<vector>
#include<algorithm>
#define maxim(a,b) a>b?a:b
using namespace std;
vector<pair<int,int> >V;
void read(),solve(),update(int,int),afiseaza(int);
int i,n,a,AIB[100010],A[100010],poz[100010],C[100010],cnt,query(int),maxim,maxpoz,SOL[100010],dad[100010];
int main()
{
read();
solve();
return 0;
}
void read()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&C[i]);
V.push_back(make_pair(C[i],i));
}
}
void solve()
{
sort(V.begin(),V.end());
for(vector<pair<int,int> >::iterator it=V.begin();it!=V.end();it++)
if(it->first!=(it+1)->first)A[it->second]=it-V.begin()+1; //normalizare
for(i=1;i<=n;i++)
{
if(!A[i])continue;
cnt=query(A[i])+1;
if(cnt>maxim){maxim=cnt;maxpoz=i;}
update(A[i],cnt);
}
printf("%d\n",maxim);
afiseaza(maxpoz);
}
void afiseaza(int X)
{
if(!X)return;
afiseaza(dad[X]);
printf("%d ",C[X]);
}
void update(int X,int val)
{
for(;X<=n;X+=X&(-X))
if(AIB[X]<val)
{
AIB[X]=val;
poz[X]=i;
}
}
int query(int X)
{
int S=0,pos=0;
for(;X>0;X-=X&(-X))//S=maxim(S,AIB[X]);
if(AIB[X]>S)
{
S=AIB[X];
pos=poz[X];
}
dad[i]=pos;
return S;
}