Cod sursa(job #2174811)

Utilizator infomaxInfomax infomax Data 16 martie 2018 13:37:01
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <fstream>

#define f first
#define s second

using namespace std;

ifstream F("scmax.in");
ofstream G("scmax.out");

int n, poz, p[100003], v[100003], st, dr, mij, a, sol[100003];
pair<int, int> k[100003];

int main()
{
    F >> n;
    for(int i = 1; i <= n; ++ i) F >> v[i];
    k[1]={v[1], 1}; poz=1;
    for(int i = 2; i <= n; ++ i){
        int po = -1;
        st=1;dr=poz;
        while(st<=dr){
            mij=(st+dr)>>1;
            if(k[mij].f >= v[i]) dr=mij-1, po=mij;
            else st=mij+1;
        }
        if(po==-1){
            k[++poz]={v[i], i};
            p[i]=k[poz-1].s;
        }
        else{
            k[po]={v[i], i};
            p[i]=k[po-1].s;
        }
    }
    G << poz<<'\n';
    poz=k[poz].s;
    while(poz){
        sol[++a] = poz;
        poz=p[poz];
    }
    for(int i = a;i > 0; -- i)
        G << v[sol[i]] << " ";
    return 0;
}