Cod sursa(job #2145588)

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

using namespace std;

int n;
int a[INF], b[INF], len[INF];
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] = ind.find(a[i])->second+1;

}

void ins(int pos,int x){
    if(pos>n)return;
    if(x>aib[pos])aib[pos]=x;
    ins(pos+tail(pos),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;i>0&&best>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;
}