Cod sursa(job #2042251)

Utilizator eragon0502Dumitrescu Dragos eragon0502 Data 18 octombrie 2017 11:20:18
Problema Subsir crescator maximal Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <cstdio>
#include <algorithm>

using namespace std;

pair <int,int> p[100005];

int v[100005],ai[500005],rez;

void init(int poz, int st, int dr)
{
    if(st==dr)
        ai[poz]=v[st];
    else
    {
        init(2*poz+1,(st+dr)/2+1,dr);
        init(2*poz,st,(st+dr)/2);
        ai[poz]=max(ai[poz*2],ai[poz*2+1]);
    }
}

void update(int poz, int st, int dr, int loc, int x)
{
    if(st==dr)
        ai[poz]=x;
    else
    {
        int mijl=(st+dr)/2;
        if(loc<=mijl)
            update(2*poz,st,mijl,loc,x);
        else
            update(2*poz+1,mijl+1,dr,loc,x);
        ai[poz]=max(ai[2*poz],ai[2*poz+1]);
    }

}

void maxint(int poz, int st, int dr, int a, int b)
{
    if(st>=a&&dr<=b)
        rez=max(rez,ai[poz]);
    else
    {
        int mijl=(st+dr)/2;
        if(b>mijl)
            maxint(2*poz+1,mijl+1,dr,a,b);
        if(a<=mijl)
            maxint(2*poz,st,mijl,a,b);
    }
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    int n,x;

    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&p[i].first);
        v[i]=p[i].first;
        p[i].second=i;
    }

    sort(p+1,p+n+1);
    int k=1;
    int z=0;
    while(k<=n)
    {
        if(p[k].first!=p[k-1].first)
            ++z;
        v[p[k].second]=z;
        ++k;
    }

    //init(1,1,n);

    for(int i=1;i<=n;++i)
    {
        x=v[i];
        rez=0;
        if(x!=1)
            maxint(1,1,z,1,x-1);
        else
            rez=0;
        int rez1=rez+1;
        rez=0;
        maxint(1,1,z,1,x);
        int rez2=rez;
        if(rez2<rez1)
        {
            update(1,1,z,x,rez1);
        }
    }

    printf("%d",ai[1]);

    return 0;
}