Cod sursa(job #2387560)

Utilizator bluestorm57Vasile T bluestorm57 Data 24 martie 2019 20:51:38
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

int n;
int v[100005],best[100005],poz[100005],nr,cmax,pozmax,l[100003],pos;
char s[500000001];

void see(int x){

    if(poz[x]!=-1 && poz[x]>=1)
        see(poz[x]);

    g<<v[x]<<" ";
}

void made(){
    int j=1,i;
    int n=strlen(s);
    for(i=0; i<n; i++)
        if(s[i]>='0' && s[i]<='9'){
            v[j]=v[j]*10+s[i]-'0';
            i++;


            while(s[i]>='0' && s[i]<='9'){
               v[j]=v[j]*10+s[i]-'0';
               i++;
            }

            j++;
        }
}

int caut1(int x){
    int mij,li,ls;
    li=0;
    ls=nr;
    mij=(li+ls)/2;
    while(li<=ls){
        if(v[l[mij]]<x && v[l[mij+1]]>=x) return mij;
        if(v[l[mij+1]]<x){
            li=mij+1;
            mij=(li+ls)/2;
        }
        else
        {

            ls=mij-1;
            mij=(li+ls)/2;
        }
    }
    return nr;
}

int main(){
    nr=1;
    int i,j;
    f>>n;
    f.get();
//
    f.getline(s,5000001);
    made();
    //for(i=1; i<=n; i++)
        //f>>v[i];

    best[1]=l[1]=1;

    for(i=2; i<=n; i++){
        pos=caut1(v[i]);

        poz[i]=l[pos];

        best[i]=pos + 1;

        l[pos+1]=i;

        if(nr<pos+1) nr = pos+1;

    }

    int maxim=0;
    pos=0;

    for(i=0; i<=n; i++)
        if(maxim<best[i]){
            maxim=best[i];
            pos=i;
        }

    g<<maxim<<"\n";
    see(pos);
   /*g<<pos<<"\n";
    for(i=1; i<=n; i++)
        g<<best[i]<<" ";*/

    return 0;
}