Cod sursa(job #1423709)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 22 aprilie 2015 13:50:44
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include<fstream>
#include<algorithm>
using namespace std;
int n, i, p, u, mid, nr, maxim;
int v[100002], t[100002], f[100002], a[100002], L[100002];
ifstream fin("scmax.in");
ofstream fout("scmax.out");
void update(int p){
    for(int i = p; i <= nr; i += (i & -i)){
        if(L[p] > L[a[i]]){
            a[i] = p;
        }
    }
}
int query(int p){
    int maxim = 0;
    int nr = 0;
    for(; p; p -= (p & -p)){
        if(maxim < L[a[p]]){
            maxim = L[a[p]];
            nr = a[p];
        }
    }
    return nr;
}
void drum(int p){
    if(p != 0){
        drum(t[p]);
        fout<< f[p] <<" ";
    }
}
int main(){
    fin>> n;
    for(i = 1; i <= n; i++){
        fin>> v[i];
        f[i] = v[i];
    }
    sort(f + 1, f + n + 1);
    nr = 1;
    for(i = 2; i <= n; i++){
        if(f[i] != f[nr]){
            f[++nr] = f[i];
        }
    }
    for(i = 1; i <= n; i++){
        p = 1;
        u = nr;
        while(p <= u){
            mid = (p + u) / 2;
            if(f[mid] == v[i]){
                break;
            }
            else{
                if(f[mid] < v[i]){
                    p = mid + 1;
                }
                else{
                    u = mid - 1;
                }
            }
        }
        v[i] = mid;
    }
    L[v[1]] = 1;
    update(v[1]);
    for(i = 2; i <= n; i++){
        maxim = query(v[i]);
        if(maxim == 0 && L[v[i]] == 0){
            L[v[i]] = 1;
            update(v[i]);
        }
        else{
            if(L[maxim] > L[v[i]]){
                L[v[i]] = L[maxim] + 1;
                t[v[i]] = maxim;
                update(v[i]);
            }
        }
    }
    for(i = 1; i <= nr; i++){
        if(L[i] > maxim){
            maxim = L[i];
            p = i;
        }
    }
    fout<< maxim <<"\n";
    drum(p);
    return 0;
}