Cod sursa(job #874923)

Utilizator razvan.popaPopa Razvan razvan.popa Data 9 februarie 2013 14:15:25
Problema Subsir crescator maximal Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<fstream>
#include<vector>
#include<algorithm>
#define INF (1 << 30)
#define FOR(i,a,b)\
   for(int i=a; i<=b; ++i)
#define infile "scmax.in"
#define outfile "scmax.out"
#define nMax 100005
using namespace std;

ofstream g(outfile);

int v[nMax], vMin[nMax];

int Prev[nMax], Lg[nMax];

int N, Best;

void read(){
    ifstream f(infile);

    f >> N;

    FOR(i,1,N)
       f >> v[i];

    f.close();
}

int search(int l, int r, int val){
    int ret = 0;

    while(l <= r){
        int m = (l + r) / 2;

        if(v[vMin[m]] < val){
            ret = vMin[m];
            l = m + 1;
        }
        else
            r = m-1;
    }

    return ret;
}

void update(int i, int val){
    if(v[i] < v[vMin[val]])
       vMin[val] = i;

    if(Lg[Best] < Lg[i])
       Best = i;
}

void solve(){
    v[0] = INF;
    FOR(i,1,N){
        int pos = search(1, i-1, v[i]);

        Lg[i] = Lg[pos] + 1;
        Prev[i] = pos;

        update(i, Lg[i]);
    }
}

void print(int pos){
    if(!pos)
      return;

    print(Prev[pos]);

    g << v[pos] << " ";
}

int main(){
    read();

    solve();

    g << Lg[Best] << '\n';

    print(Best);

    g.close();

    return 0;
}