Pagini recente » Rating Cezar Pirvu (cezar_pirvu) | Cod sursa (job #1638348) | Cod sursa (job #1875831) | Cod sursa (job #1387377) | Cod sursa (job #2257712)
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
#define zeros(x) (x^(x-1)&x)
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,sol[100001],p,rad,M,val[100001],d[100001],Max;
struct element
{
int val;
int ind;
};
element v[100001],aib[100001];
bool cmp(struct element x,struct element y)
{
return (x.val<y.val);
}
void update(int x,int val)
{
d[x]+=val;
for(int i=x; i<=n; i+=zeros(i))
{
if(d[x]>aib[i].val)
{
aib[i].val=d[x];
aib[i].ind=x;
}
}
}
element calcul(int x)
{
element M;
M.val=0;
for(int i=x; i>0; i-=zeros(i))
if(M.val<aib[i].val)
M=aib[i];
return M;
}
void afis(int x)
{
if(Max>1)
{
Max--;
afis(sol[x]);
}
g<<val[x]<<' ';
}
int main()
{
f>>n;
for(int i=1; i<=n; i++)
{
f>>v[i].val;
val[i]=v[i].val;
v[i].ind=i;
aib[i].ind=i;
}
sort(v,v+n+1,cmp);
update(v[1].ind,1);
for(int k=2; k<=n; k++)
{
if(v[k].val!=v[k-1].val)
{
element M=calcul(v[k].ind-1);
update(v[k].ind,M.val+1);
sol[v[k].ind]=M.ind;
if(M.val+1>Max)
{
rad=v[k].ind;
Max=M.val+1;
}
}
}
g<<Max<<endl;
afis(rad);
return 0;
}