Pagini recente » Cod sursa (job #1306168) | Cod sursa (job #1163206)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int lsb(int nr)
{
return ((nr)&(-nr));
}
int aib[100005],vl[100005];
void update(int where,int val)
{
int i;
for (i=where;i<100003;i+=lsb(i))
if (vl[val]>vl[aib[i]])
aib[i]=val;
}
int query(int where)
{
int i,imx;
imx=0;
for (i=where;i>0;i-=lsb(i))
if (vl[aib[i]]>vl[imx])
imx=aib[i];
return imx;
}
int i,n,nr,last,imx,l,imxl,bk[100005],ilast;
vector <pair<int,int> > v;
vector <int> rv,r;
int main(void)
{
FILE * f;
f=fopen("scmax.in","r");
ofstream g("scmax.out");
fscanf(f,"%d",&n);
for (i=0;i<n;i++)
{
fscanf(f,"%d",&nr);
v.push_back(make_pair(nr,i));
rv.push_back(nr);
}
sort(v.begin(),v.end());
nr=1;
last=v[0].first;
v[0].first=v[0].second;
v[0].second=nr;
for (i=1;i<v.size();i++)
{
if (v[i].first!=last)
nr++;
last=v[i].first;
v[i].first=v[i].second;
v[i].second=nr;
}
sort(v.begin(),v.end());
for (i=0;i<v.size();i++)
{
nr=v[i].second;
imx=query(nr-1);
vl[i]=vl[imx]+1;
bk[i]=imx;
if (vl[i]>vl[imxl])
imxl=i;
update(nr,i);
}
i=imxl;
while (i!=0)
{
r.push_back(rv[i]);
ilast=i;
i=bk[i];
}
if (rv[i]<rv[ilast])
r.push_back(rv[i]);
g<<r.size()<<'\n';
for (i=r.size()-1;i>=0;i--)
g<<r[i]<<' ';
g<<'\n';
g.close();
return 0;
}