Cod sursa(job #1423744)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 22 aprilie 2015 15:22:07
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 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], b[100002], pmaxim;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

void update(int p, int val, int poz){
    for(p; p <= nr; p += (p & -p)){
        if(val > a[p]){
            a[p] = val;
            b[p] = poz;
        }
    }
}
int query(int p){
    int maxim = 0;
    for(; p; p -= (p & -p)){
        if(maxim < a[p]){
            maxim = a[p];
            pmaxim = b[p];
        }
    }
    return maxim;
}
void drum(int p){
    if(p != 0){
        drum(t[p]);
        fout<< f[v[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[1] = 1;
    update(v[1], L[1], 1);

    for(i = 2; i <= n; i++){
        maxim = query(v[i]-1);

        L[i] = 1 + maxim;
        if (L[i] != 1)
            t[i] = pmaxim;
        update(v[i], L[i], i);
    }
    maxim = 0;
    for(i = 1; i <= n; i++){
        if(L[i] > maxim){
            maxim = L[i];
            p = i;
        }
    }
    fout<< maxim <<"\n";
    drum(p);
    return 0;
}