Cod sursa(job #2542609)

Utilizator divianegoescuDivia Negoescu divianegoescu Data 10 februarie 2020 11:59:37
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>
#define K 100005
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n,i,k,st,dr,mid,v[K],d[K],t[K];
//d[i]=indicele celei mai mici valori in care se termina un subsir de lg i
void af(int x){
    if(t[x])af(t[x]);
    fout<<v[x]<<" ";
}
int main(){
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>v[i];
    d[++k]=1;
    for(i=2;i<=n;i++){
//caut pozitia ultimei valori d[poz] ai v[i]>v[d[poz]] (d sortat crescator mereu)
//ori modific elem curent (poz) (am gasit o val mai mica in care se termina un subsir de lg respectiva), ori adaug elem nou (continui subsirul de lg max)
        st=1; dr=k;
        while(st<=dr){ //in st ramane poz primei valori >= v[i]
            mid=(st+dr)/2;
            if(v[d[mid]]>=v[i])
                dr=mid-1;
            else st=mid+1;
        }
        if(st>k)d[++k]=i;
        else d[st]=i;
        t[i]=d[st-1];
    }
    fout<<k<<"\n";
    af(d[k]);
    return 0;
}