Cod sursa(job #1877152)

Utilizator FlowstaticBejan Irina Flowstatic Data 12 februarie 2017 23:56:10
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <vector>
#define NMAX 100005
#define INF (1<<30)+10
using namespace std;

FILE* fin = fopen("scmax.in","r");
FILE* fout = fopen("scmax.out","w");
int a[NMAX],best[NMAX], poz[NMAX],lg;
vector<int> sol;
//best[i] = cel mai mic element cu care se poate termina un subsir crescator de lg i
//poz[i] = pozitia pe care a fost plasat a[i] in best

int CautaBinar(int x)
{
    int st, fi, mij;
    st = 0; fi = lg+1;
    while(fi-st>1)
    {
        mij = (st+fi)/2;
        if(best[mij] >= x)
            fi = mij;
        else
            st = mij;
    }
    return fi;
}

int main()
{
    int N;
    fscanf(fin,"%d",&N);
    for(int i = 1; i<=N; i++)
    {
        fscanf(fin,"%d",&a[i]);
    }

    for(int i = 1; i<=N; i++)
    {
        if(a[i] > best[lg])
        {
            lg++;
            best[lg] = a[i];
            poz[i] = lg;

        }
        else
        {
            int pp = CautaBinar(a[i]);
            best[pp] = a[i];
            poz[i] = pp;
        }
    }

    fprintf(fout,"%d\n",lg);

    for(int i = N; i>=0 && lg;i--)
        if(poz[i] == lg)
        {
            lg--;
            sol.push_back(a[i]);
        }
    for(int i = sol.size()-1; i>=0;i--)
        fprintf(fout,"%d ",sol[i]);
    fprintf(fout,"\n");
    return 0;
}