Pagini recente » Cod sursa (job #619722) | Cod sursa (job #1706956) | Cod sursa (job #1045225) | Cod sursa (job #2348811) | Cod sursa (job #827572)
Cod sursa(job #827572)
#include <fstream>
#include <algorithm>
#define zeros(x) (x&-x)
using namespace std;
ofstream g("scmax.out");
int aib[100005],x[100005],n,s[100005],prec[100005],sol[100005];
void citire()
{
ifstream f("scmax.in");
f>>n;
for(int i=1;i<=n;i++)
{
f>>x[i];
s[i]=x[i];
}
}
void update(int i,int x)
{
for(;i<=n;i+=zeros(i))
if(sol[aib[i]]<sol[x])
aib[i]=x;
}
int query(int i)
{
int maxx=0;
for(;i;i-=zeros(i))
if(sol[aib[i]]>sol[maxx])
maxx=aib[i];
return maxx;
}
void afis(int i)
{
if(!i)
return;
afis(prec[i]);
g<<s[x[i]]<<' ';
}
int main()
{
citire();
int maxim=0,maxx=0;
sort(s+1,s+n+1);
int h=1;
for(int i=2;i<=n;i++)
if(s[h]!=s[i])
s[++h]=s[i];
for(int i=1;i<=n;i++)
x[i]=lower_bound(s+1,s+h+1,x[i])-s;
for(int i=1;i<=n;i++)
{
prec[i]=query(x[i]-1);
sol[i]=sol[prec[i]]+1;
if(sol[i]>maxim)
{
maxim=sol[i];
maxx=i;
}
update(x[i],i);
}
g<<maxim<<'\n';
afis(maxx);
return 0;
}