Cod sursa(job #2257681)

Utilizator iulius510iulius alexandru iulius510 Data 10 octombrie 2018 12:45:30
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 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[i]>aib[i].val)
        {
            aib[i].val=d[i];
            aib[i].ind=i;
        }
    }

}
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;
}
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);
         update(v[k].ind,M.val+1);
         Max=max(M.val+1,Max);
        }

    }
    g<<Max+1;
    return 0;
}