Cod sursa(job #2258125)

Utilizator iulius510iulius alexandru iulius510 Data 10 octombrie 2018 21:17:47
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#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+1,v+n+1,cmp); //Normalizam vecotrul v
      for(int k=1; 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;
}