Cod sursa(job #2257721)

Utilizator iulius510iulius alexandru iulius510 Data 10 octombrie 2018 13:57:12
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#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);
      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;
                if(M.val+1>Max)
                {
                    rad=v[k].ind;
                    Max=M.val+1;
                }
            }

        }
        g<<Max<<endl;
        afis(rad);


    return 0;
}