Cod sursa(job #1240570)

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

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

int n,val,val2,poz,maxim,start,finish,sol_glob;

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

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

void query(int nod,int left,int right)
{

    if(start <= left && right <= finish && val > v[nod].m && v[nod].sol+1 > maxim){
        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 solve()
{
    in>>n;
    int x;
    in>>x;
    val = x;
    val2 = 1;
    poz = 1;
    update(1,1,n);
    for(int i = 2 ; i <= n ; i++)
    {
        in>>x;
        maxim = 1;
        start = 1;
        finish = i-1;
        val = x;
        query(1,1,n);
        val = x;
        val2 = maxim;
        poz = i;
        update(1,1,n);
        if(sol_glob < maxim)
            sol_glob = maxim;
    }
    out<<sol_glob;
}

int main()
{
    solve();
}