Pagini recente » Cod sursa (job #1984259) | Cod sursa (job #3218739) | Cod sursa (job #1891455) | Cod sursa (job #344159) | Cod sursa (job #630026)
Cod sursa(job #630026)
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<pair<int,int> >V;
void read(),solve(),update(int),afis(int);
int i,n,a,best[100010],AIB[100010],A[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",&a);
V.push_back(make_pair(a,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(A[SOL[cnt]]>A[i]||!SOL[cnt])SOL[cnt]=i;
if(cnt>maxim){maxim=cnt;maxpoz=i;dad[i]=SOL[cnt-1];}
update(A[i]);
}
printf("%d\n",maxim);
afis(maxpoz);
/* for(;cnt;cnt=dad[cnt])
{
vector<pair<int,int> >::iterator it=V.begin();
printf("%d ",(it+A[cnt]-1)->first);
}*/
}
void afis(int X)
{
if(!X)return;
afis(dad[X]);
vector<pair<int,int> >::iterator it=V.begin();
printf("%d ",(it+A[X]-1)->first);
}
void update(int X)
{
for(;X<=n;X+=X&(-X))++AIB[X];
}
int query(int X)
{
int S=0;
for(;X>0;X-=X&(-X))S+=AIB[X];
return S;
}