Cod sursa(job #1239699)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 9 octombrie 2014 17:01:01
Problema Subsir crescator maximal Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include<fstream>
#include<iostream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int DMAX = 10009;

struct arb{
    double m;
    int sol;
};
arb v[DMAX*3];

int n,val2,poz,start,finish,maxim,lg[DMAX],sol2;
double valoare,s[DMAX];

void update(int nod,int left,int right)
{
    if(left == right)
    {

        v[nod].m = valoare;
        v[nod].sol = val2;
        return;
    }
    int mij = (left+right)/2;
    if(poz <= mij) update(nod*2,left,mij);
    else update(nod*2+1,mij+1,right);
    if(v[nod*2].sol >= v[nod*2+1].sol)
        v[nod] = v[nod*2];
    else
        v[nod] = v[nod*2+1];
}

void query(int nod,int left,int right)
{
    if(start <= left && right <= finish && v[nod].m < valoare && maxim < v[nod].sol +1 ){
        maxim = v[nod].sol+1;
        return;
    }
    if(left == right)
        return;

    int mij  = (left+right)/2;
    if(start <= mij) query(nod*2,left,mij);
    if(finish > mij) query(nod*2+1,mij+1,right);
}

void citire()
{

    in>>n;
    double x;
    for(int i = 1 ; i <= n ; i++)
    {
        in>>x;
        s[i] = x;
        poz = i;
        valoare = x;
        val2 = 0;
        update(1,1,n);
    }
    val2 = 1;
    valoare = s[1];
    poz = 1;
    update(1,1,n);
    lg[1] = 1;
    sol2 = 1;
}

void solve()
{

    for(int i = 2 ; i <= n ; i++){
        maxim = 1;
        valoare = s[i];
        start = 1;
        finish = i-1;
        query(1,1,n);
        if(i == 2)
            cout<<maxim;
        lg[i] = maxim;
        if(sol2 < maxim)
            sol2 = maxim;
        poz = i;
        val2 = lg[i];
        update(1,1,n);
    }
    out<<sol2;
}

int main()
{

    citire();
    solve();
    return 0;
}