Cod sursa(job #2145642)

Utilizator the@EyE@Postavaru Stefan the@EyE@ Data 27 februarie 2018 15:06:03
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<stdio.h>
#include<algorithm>
#include<unordered_map>
#include<deque>
#define INF 100001

using namespace std;

int n;
int a[INF], b[INF], len[INF];
unordered_map<int,int> ind;
int aib[INF];
deque<int> ans;

int tail(int x){
    return (x^(x-1))&x;
}

void read_data(){
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for(int i=0;i<n;++i){
        scanf("%d",&a[i]);
        b[i] = a[i];
    }
    /*sort(b,b+n);
    for(int i=0;i<n;++i)
        if(ind.find(b[i])==ind.end())
            ind.insert(pair<int,int>(b[i],i));*/
    for(int i=0;i<n;++i)
        b[i] = i+1;

}

void ins(int pos,int x){
    for(int i=pos;i<=n;i+=tail(i))
        if(aib[i]<x)aib[i]=x;
}

int query(int x){
    int mx = 0;
    for(int i=x;i>0;i-=tail(i))
        if(aib[i]>mx)
            mx=aib[i];
    return mx;
}

int main(){
    read_data();
    len[0]=1;ins(b[0],1);
    int best=1;
    for(int i=1;i<n;++i){
        len[i] = query(b[i]-1)+1;
        if(len[i]>best)best=len[i];
        ins(b[i],len[i]);
    }
    printf("%d\n",best);
    int i;
    for(i=n-1;i>-1;i--)
        if(len[i]==best){ans.push_front(a[i]);best--;break;}
    for(i;best>0&&i>=0;--i)
        if(len[i]==best&&a[i]<ans[0]){
            ans.push_front(a[i]);
            best--;
        }
    for(i=0;i<ans.size();++i)printf("%d ",ans[i]);
    return 0;
}