Cod sursa(job #1040192)

Utilizator dan.ghitaDan Ghita dan.ghita Data 24 noiembrie 2013 08:12:53
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <unordered_map>
#define zeros(x) x&(x-1)^x
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n, v[1000], sortat[10000], d[10000], aib[10000];
unordered_map<int, int> h;
void update(int poz, int x){
for(int i=poz; i<=n; i+=zeros(i)){
    aib[i]=max(x, aib[x]);
    }

}

int query(int poz){
int mx=0;
for(int i=poz; i>0; i-=zeros(i)){
    mx=max(mx, aib[i]);
}
return mx;
}

void scmax(){
int mx=0;
    for(int i=1; i<=n; ++i){
        mx=query(h[v[i]]-1);
        d[i]=mx+1;
        update(i,d[i]);
    }


}

void sir(int p, int mx){
if(!p||!mx) return;
int t=0;
if(d[p]==mx) mx--, t=1;
sir(p-1, mx);
if(t) g<<v[p]<<' ';

}

int main()
{
    f>>n;
    for(int i=1; i<=n; ++i)
        f>>v[i], sortat[i]=v[i];
    sort(sortat+1, sortat+n+1);
    for(int i=1; i<=n; ++i)
        h[sortat[i]]=i;
    scmax();
    int mx=0, pmx;
    for(int i=1; i<=n; ++i){
        if(d[i]>mx) mx=d[i], pmx=i;
    }
    g<<mx<<'\n';
    sir(pmx, mx);
//    for(int i=pmx; i>0&&mx; --i)
//    if(d[i]==mx) g<<v[i]<<' ', mx--;

    return 0;
}