Cod sursa(job #2203944)

Utilizator danielsociuSociu Daniel danielsociu Data 13 mai 2018 19:48:46
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
#define mx 100050
#define nrmx 2000000050

long A[mx], Q[mx];
int P[mx], N, len;

int InsertVal(long k, int st, int dr){
    int md=(st+dr)/2;
    if(st==dr){
        if(dr>len) Q[++len+1]=nrmx;
        Q[st]=k;
        return st;
    }
    else if(k<=Q[md]) InsertVal(k,st,md);//else if(k<Q[md]) pentru a nu fi strict crescator
         else InsertVal(k,md+1,dr);
}
void crearePQ(){
    len =0; Q[1]=nrmx;
    for(int i=1;i<=N;i++){
        P[i]=InsertVal(A[i],1,len+1);
    }
}

void afis(int xd, int i){ //xd e len; i=N
    //Da... clar, tot timpul le afisam in ordine inversa... fml xD
   /* cout<<len<<endl;
    int i=N;
    while(len){
        if(P[i]==len){
            cout<<A[i]<<" ";
            --len;
        }
        --i;
    }*/
    if(xd){
        if(P[i]==xd){
            afis(xd-1,i-1);
            cout<<A[i]<<" ";
        }else
            afis(xd,i-1);
    }else
        cout<<len<<endl;//Ok, am facut ceva interesant aici :))
}

int main(){
    cin>>N;
    for(int i=1;i<=N;i++)
        cin>>A[i];
    crearePQ();
    afis(len,N);
}