Pagini recente » Cod sursa (job #2169567) | Cod sursa (job #2311726) | Cod sursa (job #646990) | Cod sursa (job #508393) | Cod sursa (job #2258960)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int i,n;
struct adat
{
int a,b,maxi; /*a-bal veg; b-jobb veg; maxi-leghosszabb monoton novekvo
reszsorozat hossza az a-b intervallumon*/
};
vector<adat>f(262144); /*intervallumfa*/
struct adat2
{
int i,e,l; /*i-index, e-ertek*/
};
vector<adat2>x; /*a sorozatom*/
int fa (int bal, int jobb, int i)
{
f[i].a=bal;
f[i].b=jobb;
f[i].maxi=0;
if(bal!=jobb)
{
fa(bal, (bal+jobb)/2, i*2);
fa((bal+jobb)/2+1, jobb, i*2+1);
}
}
int has (adat2 a, adat2 b)
{
if(a.e>b.e) return 0;
else if(a.e==b.e) return (a.i>b.i);
}
int has2 (adat2 a, adat2 b)
{
if(a.i>b.i) return 0;
}
int betesz (int i, int h) /*i-az adott elem indexe, ahol a faban vagyunk
h-annak az elemnek az indexe a sorzatban, amit beteszunk*/
{
if(f[i].a==f[i].b && f[i].a==h) f[i].maxi=1;
else
{
if(f[i*2].a<=h && f[i*2].b>=h)
{
betesz(i*2, h);
if(f[i*2+1].maxi==0) f[i].maxi=max(f[i].maxi, f[i*2].maxi);
}
else
{
int k=f[i*2+1].maxi;
betesz(i*2+1, h);
if(k!=f[i*2+1].maxi)f[i].maxi++;
}
}
}
int main()
{
cin>>n;
fa(1,n,1);
x.resize(n+1);
for(i=1;i<=n;++i)
{
cin>>x[i].e;
x[i].i=i;
}
sort(x.begin(), x.end(), has);
for(i=1;i<=n;++i)
{
betesz (1,x[i].i);
// for(int j=1;j<=9;++j) cout<<f[j].a<<"-"<<f[j].b<<" "<<f[j].maxi<<"\n";
//cout<<"\n";
x[i].l=f[1].maxi;
}
sort(x.begin(), x.end(), has2);
int k=f[1].maxi;
vector<int>megold(k+1);
for(i=n;i>=1;--i)
{
if(x[i].l==k)
{
megold[k]=x[i].e;
k--;
}
}
cout<<f[1].maxi<<"\n";
for(i=1;i<=f[1].maxi;++i) cout<<megold[i]<<" ";
return 0;
}