Cod sursa(job #2814834)

Utilizator SeracovanuEdwardSeracovanu Edward SeracovanuEdward Data 8 decembrie 2021 17:51:20
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;
class parsare{
private:
    FILE *fin;
    char *buff;
    int sp;
    char read_ch(){
    ++sp;
    if(sp==4096){
        sp=0;
        fread(buff,1,4096,fin);
    }
    return buff[sp];
    }
public:
    parsare(const char *name){
    fin=fopen(name,"r");
    buff=new char[4096]();
    sp=4095;
    }
    parsare& operator >>(int &n){
    char c;
    while(!isdigit(c=read_ch()));
    n=c-'0';
    while(isdigit(c=read_ch()))
        n=n*10+c-'0';
    return *this;
    }
};
const int nmax=1e5;
int n,A[nmax+1],best[nmax+1],L[nmax+1],p[nmax+1],nr=1;
inline int caut(int x){
int st=0,dr=nr,mid;
while(st<=dr){
    mid=(st+dr)/2;
    if(A[L[mid]]<x && A[L[mid+1]]>=x)
        return mid;
    else if(A[L[mid]]<x)
            st=mid+1;
            else dr=mid-1;
}
return nr;
}
FILE *g=fopen("scmax.out","w");
void afis(int i){
if(p[i]>0)afis(p[i]);
fprintf(g,"%d ",A[i]);
}
static void solve(){
best[1]=L[1]=1,L[0]=0;
int poz;
for(int i=2;i<=n;++i){
    poz=caut(A[i]);
    p[i]=L[poz];
    best[i]=poz+1;
    L[poz+1]=i;
    if(nr<poz+1)nr=poz+1;
}
poz=0;
int maxim=-1;
for(int i=1;i<=n;++i)
if(maxim<best[i]){
    maxim=best[i];
    poz=i;
}
fprintf(g,"%d\n",maxim);
afis(poz);
}
int main()
{
    parsare fin("scmax.in");
    fin>>n;
    for(int i=1;i<=n;++i)
        fin>>A[i];
    solve();
}