Cod sursa(job #2030019)

Utilizator marvelousMarvelous marvelous Data 30 septembrie 2017 21:16:19
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <bits/stdc++.h>

#define f first
#define s second

using namespace std;

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

int n, v[100005], poz, po, st, dr, mij, k[100005];
pair<int, int> p[100005];
stack<int> St;

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