Cod sursa(job #2540276)

Utilizator mihnea03Ciocioiu Mihnea mihnea03 Data 6 februarie 2020 22:12:24
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>
#define dim 100010
using namespace std;
int a[dim];
int d[dim];
int t[dim];
int sol[dim];
int i,n,u,k,st,dr,mid;

int main() {
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");
    fin>>n;
    for (i=1;i<=n;i++) {
        fin>>a[i];
    }
    d[++u]=1;
    for (i=2;i<=n;i++) { ///d[i]=indicele la care se termina un subsir crescator de lungime i
        st=1;
        dr=u;
        while (st<=dr) { ///caut ultimul element mai mic sau egal cu a[i]
            mid=(st+dr)/2;
            if (a[d[mid]]<a[i]) st=mid+1;
            else dr=mid-1;
        }
        ///a[d[dr]]<=a[i]
        ///a[d[st]]>a[i]
        if (st>u) {
            d[++u]=i;
            t[i]=d[dr];
        }
        else {
            d[st]=i;
            t[i]=d[dr];
        }
    }
    fout<<u<<"\n";
    i=d[u];
    while (i!=0) {
        sol[++k]=a[i];
        i=t[i];
    }
    for (i=k;i>=1;i--) fout<<sol[i]<<" ";
    return 0;
}