Pagini recente » Cod sursa (job #1267685) | Cod sursa (job #553121) | Cod sursa (job #203131) | Cod sursa (job #2560552) | Cod sursa (job #2442008)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,i,v[100005],l[100005],rez[100005],aib[100005],p,poz,Max,m,a[100005],b[100005],afis[100005], fr[100005];
int ub(int x)
{
return (x&(-x));
}
void Update(int x)
{
for(int i=x; i<=n; i+=ub(i))
aib[i]++;
}
int sum(int x)
{
int s=0;
for(int i=x; i>=1; i-=ub(i))
s+=aib[i];
return s;
}
void normalizare()
{
sort(b+1,b+n+1);
a[++m]=b[1];
for(int i=2; i<=n; i++)
{
if(b[i]!=b[i-1])
a[++m]=b[i];
}
int st=0, dr=0, mij=0;
int p=0;
for(int i=1; i<=n; i++)
{
st=1,dr=m;
while(st<=dr)
{
mij=(st+dr)/2;
if(v[i]>=a[mij])
{
st=mij+1;
p=mij;
}
else
dr=mij-1;
}
v[i]=p;
}
}
int main()
{
f>>n;
for(i=1; i<=n; i++)
{
f>>v[i];
b[i]=v[i];
afis[i]=v[i];
}
normalizare();
l[1]=1;
Update(v[1]);
for(i=2; i<=n; i++)
{
l[i]=sum(v[i]-1)+1;
if(l[i]>Max)
{
p=i;
Max=l[i];
}
if(fr[v[i]]==0)
Update(v[i]);
fr[v[i]]++;
}
g<<Max<<'\n';
poz=p;
m=0;
rez[++m]=afis[p];
for(i=p-1; i>=1; i--)
{
if(l[i]==l[poz]-1 && v[i]<v[poz])
rez[++m]=afis[i];
poz=i;
}
reverse(rez+1,rez+Max+1);
for(i=1; i<=Max; i++)
g<<rez[i]<<' ';
return 0;
}