Pagini recente » Cod sursa (job #2655756) | Cod sursa (job #1644585) | Cod sursa (job #2862917) | Cod sursa (job #298683) | Cod sursa (job #2257950)
#include <fstream>
#include <algorithm>
using namespace std;
#define zeros(x) ((x^(x-1))&x)
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,sol[100001],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)
{
if(x.val!=y.val)
return(x.val<y.val);
else return (x.ind<y.ind);
}
void update(int x,int val) //adaugam val pe pozitia x, si inoim arborele indexat binar
{
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) //calculam maximul de la poz [1,x-1] si aflam si pe ce pozitie este
{
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); //Normalizam vecotrul v
update(v[1].ind,1);//adaugam 1 pe pozitia v[1].ind
Max=1;
rad=v[1].ind;
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; //retinem stramosul lui v[k].ind
if(M.val+1>Max)
{
rad=v[k].ind; //retinem ultima pozitie a subsirului pe care se atinge maximul la pasul k
Max=M.val+1;
}
}
}
g<<Max<<endl;
afis(rad);
return 0;
}