Cod sursa(job #873695)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 7 februarie 2013 16:02:53
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#include <stack>
#define maxim(a,b) (a>b)?a:b
using namespace std;

ifstream in("scmax.in");
ofstream out("scmax.out");
int x[100005], v[100005], m[100005];
int n,i,j,p,k,maxp,stp;
stack <int> s;

int cautbin(int i,int s,int val) {
    if (i == s) {
        if (val > v[i]) return i+1;
        else return i;
    }
    if (k == 0) return 1;
    int mij = (i+s)/2;
    if (v[mij] == val) return mij;
    if (v[mij] > val) return cautbin(i,mij-1,val);
    else return cautbin(mij+1,s,val);
}

int main() {
    in >> n;
    for (i=1;i<=n;i++) {
        in >> x[i];
        p = cautbin(1,k,x[i]);
        k = max(k,p);
        m[i] = p;
        v[p] = x[i];
        if (p>maxp) {
            maxp = p;
            stp = i;
        }
    }
    out << k << '\n';
    s.push(x[stp]);
    int crt;
    for (i=stp-1;i>=1;i--) {
        if (x[i] < s.top() && m[i] == k-1) {
            s.push(x[i]);
            k--;
        }
    }
    while (!s.empty()) {
        out << s.top() << ' ';
        s.pop();
    }
    return 0;
}