Cod sursa(job #1083368)

Utilizator marialivia16Chiorean Maria Livia marialivia16 Data 15 ianuarie 2014 22:19:00
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <fstream>
#define maxn 100001
using namespace std;
int n,a[maxn],best[maxn],p[maxn],l[maxn],maxim,index,nr;

int searchBinary(int x)
{
    int left = 0, right = nr,m;
    while(left<=right)
    {
        m = (left+right)/2;
        if(a[l[m]] < x && a[l[m+1]] >= x) return m;
        else if(a[l[m+1]] < x) left = m+1;
            else right = m-1;
    }
    return nr;
}

void solve()
{
    best[1] = 1;
    l[0] = 0;
    l[1] = 1;
    for(int i=2;i<=n;i++)
    {
        index = searchBinary(a[i]);
        p[i] = l[index];
        best[i] = index + 1;
        l[index+1] = i;
        if(nr<index+1) nr = index+1;
    }
    for(int i=1;i<=n;i++)
    {
        if(maxim<best[i]) maxim = best[i], index = i;
    }
}
ofstream out("scmax.out");
void print(int index)
{
	if(p[index]>0)
		print(p[index]);
	out<<a[index]<<" ";
}

int main()
{
   ifstream in("scmax.in");
   in>>n;
   for(int i=1;i<=n;i++)
    {    
        in>>a[i];
    }
    in.close();
    
    solve();
    
    out<<maxim<<endl;
    print(index);
   out.close();
   return 0;
}