Cod sursa(job #1593505)

Utilizator Skittlesdddd aaaa Skittles Data 8 februarie 2016 17:38:20
Problema Subsir crescator maximal Scor 85
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <algorithm>
using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

stack <int> k;

int v[100002],n,o[100002],P[100002];

int main() {
    int i,j;
    fin >> n;
    for(i=1;i<=n;i++)
        fin >> v[i];

    int ct=1,*p,poz;
    o[1]=v[1];
    for(i=1;i<=n;i++) {
        if(v[i]>o[ct]) {
            o[++ct]=v[i];
            P[i]=ct;
        }
        else {
            p=upper_bound(o+1,o+ct+1,v[i]);
            poz=p-o;
            o[poz]=v[i];

            P[i]=poz;
        }
         //cout << ct << ' ' << poz << '\n';

    }
    /*for(int ii=1;ii<=ct;ii++)
        cout << o[ii] << ' ';
    cout << endl;*/

    for(i=n;i>=1;i--)
        if(P[i]==ct) {
            //cout << v[i] << ' ';
            k.push(v[i]);
            break;
        }

    int aux=i;
    for(;i>=1;i--) {
        if(P[i]==P[aux]-1 && v[i]<v[aux]) {
            //cout << v[i] << ' ';
            k.push(v[i]);
            aux=i;
        }
    }

    fout << ct << endl;
    while(!k.empty()) {
        fout << k.top() << ' ';
        k.pop();
    }
    return 0;
}