Cod sursa(job #1651206)

Utilizator Evghenii_BeriozchinEvghenii Beriozchin Evghenii_Beriozchin Data 12 martie 2016 18:11:35
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>

#include <fstream>

using namespace std;

long binarys( long long *a, long *t,  long long x, long long start, long long finish){
long mid=(start+finish)/2;
if (a[t[mid-1]]<x && a[t[mid+1]]>x) {if(x<=a[t[mid]]) return mid; else return mid+1;} else if (x>a[t[mid]]) return binarys(a, t,  x, mid+1, finish); else return binarys(a, t, x, start, mid-1);
}
int main()
{ long n;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
fin>>n;
long long *a= new long long[n+5];
long  *t= new long[n+5];
long  *r= new long[n+5];
long len=0;
for(long i=0; i<n; i++) r[i]=-1;
for(long i=0; i<n; i++) fin>>a[i];
t[0]=0;
for(long  i=1; i<n; i++){
    if (a[i]>a[t[len]]) {len++; t[len]=i; r[i]=t[len-1];} else
        if (a[i]!=a[t[len]]){
        if (a[i]<a[t[0]]) t[0]=i; else {
                long x=binarys(a, t, a[i], 0, len);
                 t[x]=i;
                  r[i]=t[x-1];
        }
    }

}
fout<<len+1<<endl;
long long *sol= new long long[len+5];
sol[len]=a[t[len]];
long x=len-1;
long y=len;
len=r[t[len]];
while (len>0){
   sol[x]=a[len];
   x--;
 len=r[len];
}
for(long i=0; i<=y; i++) fout<<sol[i]<<" ";
delete a; delete t; delete r; delete sol;
    return 0;
}