Cod sursa(job #1040200)

Utilizator dan.ghitaDan Ghita dan.ghita Data 24 noiembrie 2013 08:44:37
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <unordered_map>
#define zeros(x) x&(-x)
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n, v[100002], sortat[100002], d[100002], aib[100002];
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[i]);
    }

}

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(h[v[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);
    int k=0;
    for(int i=1; i<=n; ++i)
        if(!h[sortat[i]]) h[sortat[i]]=i-k;
        else k++;
    scmax();
    int mx=0, pmx;
    for(int i=1; i<=n; ++i){
        if(d[i]>mx) mx=d[i], pmx=i;
        //cout<<h[v[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;
}