Cod sursa(job #795009)

Utilizator wzrdwzrd tst wzrd Data 7 octombrie 2012 14:46:23
Problema Subsir crescator maximal Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define DN 100005
using namespace std;

int n,v[DN],bst[DN],pre[DN],ind[DN],aib[DN],paib[DN],rez[DN],sz;

bool cmp(int a, int b) {
    return v[a]<v[b];
}

inline int lsb(int n) {
    return (n&(n-1))^n;
}

void query(int i) {
    int p=i;
    int vm=1,pm=i;
    for(;i>0;i-=lsb(i)) if(aib[i]+1>vm) {
        vm=aib[i]+1;
        pm=paib[i];
    }
    pre[p]=pm; bst[p]=vm;
}

void ins(int i,int vl,int poz) {
    for(;i<=n;i+=lsb(i)) if(vl>aib[i]) {
        aib[i]=vl;
        paib[i]=poz;
    }
}

int main()
{
    ifstream f("scmax.in");
    ofstream g("scmax.out");
    f>>n;
    for(int i=1; i<=n; ++i) {
        f>>v[i];
        bst[i]=1;
        ind[i]=pre[i]=i;
    }
    sort(ind+1,ind+n+1,cmp);
    int sol=0,psol;
    for(int i=1; i<=n; ++i) {
        query(ind[i]);
        ins(ind[i],bst[i],ind[i]);
        if(bst[i]>sol) {
            sol=bst[i];
            psol=ind[i];
        }
    }
    g<<sol<<'\n';
    //cout<<psol;
    for(;psol!=pre[psol];rez[++sz]=v[psol],psol=pre[psol]);
    for(int i=sz; i>0; --i) g<<rez[i]<<' ';
    return 0;
}