Cod sursa(job #886701)

Utilizator robert.onesimRobert Onesim robert.onesim Data 23 februarie 2013 10:13:23
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>
#define NMAX 100001
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int caut(int p, int u, int val);
int n,i,mijl,bst[NMAX],a[NMAX],poz[NMAX],p,u,v[NMAX],mmic;
int main()
{
    int lg=1;
    fin>>n;
    for(i=1;i<=n;i++) fin>>a[i];
    bst[1]=a[1];poz[1]=lg;
    for(i=2;i<=n;i++)
    {
        mmic=caut (1, lg, a[i]);
        if (mmic==-1) { bst[++lg]=a[i]; poz[i]=lg; }
        else { bst[mmic]=a[i]; poz[i]=mmic; }
   }
   fout<<lg<<"\n";
   int k=0;
    for(i=n;i>0 && lg!=0;)
    {
        while(poz[i]!=lg) i--;
        v[++k]=a[i];
        lg--;
    }
    for(i=k;i>=1;i--)
        fout<<v[i]<<" ";
}
int caut (int p, int u, int val) {
    int m, bun, gasit=0;
    while (p<=u) {
        m=(p+u)/2;
        if (bst[m]>=val) { u=m-1; bun=m; gasit=1; }
        else p=m+1;
    }
    if (gasit) return bun;
    return -1;
}