Cod sursa(job #1181321)

Utilizator assa98Andrei Stanciu assa98 Data 2 mai 2014 14:48:41
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;

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

const int MAX_N=100100;

int v[MAX_N];
int d[MAX_N];
bool viz[MAX_N];
vector<int> a;
int aib[MAX_N];
int n;

map<int,int> M;

void update(int poz, int val) {
    while ( poz <= n ) {
        if(d[aib[poz]]<d[val]) {
            aib[poz]=val;
        }
        poz += ( poz & ( -poz ) );
    }
}

int query(int poz) {
    int ans=0;
    while( poz ) {
        if(d[aib[poz]]>d[ans]) {
            ans=aib[poz];
        }
        poz -= ( poz & ( -poz ) );
    }
    return ans;
}

void norm() {
    sort(a.begin(),a.end());
    a.erase(unique(a.begin(),a.end()),a.end());
    int cat=0;
    for(auto it:a) {
        M[it]=++cat;
    }
    for(int i=1;i<=n;i++) {
        v[i]=M[v[i]];
    }
}

int main() {
    fin>>n;
    for( int i=1; i<=n; i++) {
        fin >> v[i];
        a.push_back(v[i]);
    }

    norm();
    int poz=0;
    for(int i=1;i<=n;i++) {
        d[i]=d[query(v[i]-1)]+1;
        if(d[i]>d[poz]) {
            poz=i;
        }
        if(!viz[v[i]]) {
            update(v[i],i);
        }
    }
    
    fout << d[poz]<<'\n';

    vector<int> sol;
    sol.push_back(v[poz]);
    for(int i=poz-1; i>=1 && d[poz]>1; i--) {
        if( d[i]+1 == d[poz] && v[i] < v[poz] ) {
            poz=i;
            sol.push_back(v[poz]);
        }
    }

    reverse(sol.begin(), sol.end());
    for(auto it=sol.begin(); it!=sol.end(); it++) {
        fout<<a[*it-1]<<' ';
    }

    return 0;
}