Cod sursa(job #1239663)

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

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

int n,val,poz,val2,start,finish,val3,lg[DMAX],maxim,poz2,lungime,s[DMAX],rec[DMAX],sol_glob,poz_glob;

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

    if(left == right){
        v[nod].m = val;
        v[nod].p = poz;
        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(left >= start && finish >= right && v[nod].m > val3 && v[nod].sol+1 > maxim){
        maxim = v[nod].sol + 1;
        poz2 = v[nod].p;
        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;
    int x;
    for(int i = 1 ; i <= n-1 ; i++)
    {
        in>>x;
        s[i] = x;
        poz = i;
        val = x;
        val2 = 0;
        update(1,1,n);
    }
    in>>x;
    s[n] = x;
    poz = n;
    val = x;
    val2 = 1;
    update(1,1,n);
    lg[n] = 1;
    rec[n] = -1;
    sol_glob = 1;
    poz_glob = n;
}

void solve()
{

    for(int i = n-1 ; i >= 1 ; i--){

        maxim = 1;
        val3 = s[i];
        poz2 = -1;
        start = i+1;
        finish = n;
        query(1,1,n);
            lg[i] = maxim;
            rec[i] = poz2;
        if(sol_glob < lg[i]){
            sol_glob = lg[i];
            poz_glob = i;
        }
        poz = i;
        val = s[i];
        val2 = lg[i];
        update(1,1,n);
    }
    out<<sol_glob<<"\n";
    for(int i = 1 ; i <= sol_glob ; i ++){
        out<<s[poz_glob]<<" ";
        poz_glob = rec[poz_glob];
    }
    out.close();
}

int main()
{

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