Cod sursa(job #815535)

Utilizator TheShadowsAlexandru Cristian TheShadows Data 17 noiembrie 2012 10:15:02
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<cstdio>
using namespace std;
const int LIM = 10005, INF=99999999;
int v[LIM], p[LIM], q[LIM], lq=0;
void print(FILE *out, int start, int x){
    int i=start;
    for(i=start; p[i]!=x; --i);
    if(x-1>=1)
        print(out, i-1, x-1);
    fprintf(out, "%d ", v[i]);
}
int store(int x, int lo, int hi){
    int mid=(lo+hi)/2;

    if(q[mid]==x)
            return -1;
    if(lo==hi){
        if(hi>lq) q[++lq+1]=INF;
        q[lo]=x;
        return lo;
    }
    else if(x<q[mid]) return store(x, lo, mid);
        else return store(x, mid+1, hi);
}
int main(){
    FILE *in=fopen("scmax.in","r"), *out=fopen("scmax.out","w");
    int n;
    fscanf(in, "%d\n", &n);
    for(int i=1; i<=n; ++i){
        fscanf(in, "%d", &v[i]);
        p[i]=store(v[i], 1, lq+1);
        if(p[i]==-1)
            {--n; --i; }
    }
    fprintf(out, "%d\n", lq);
    print(out, n, lq);
    return 0;
}