Cod sursa(job #1545521)

Utilizator enedumitruene dumitru enedumitru Data 6 decembrie 2015 20:14:05
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream>
using namespace std;
ifstream f("scmax.in"); ofstream g("scmax.out");
const int Nmax=100001;
int N,V[Nmax],Q[Nmax],P[Nmax],SOL[Nmax];
int cautare(int key)
{   int st=1,dr=Q[0],gasit=-1;
    while(st<=dr)
    {   int m=(st+dr)/2;
        if(key<=Q[m]) {gasit=m; dr=m-1;} /// am gasit un Q[m] mai mare decat key deci caut unul mai mic
            else st=m+1;/// Q[m] este mai mic decat key deci caut unul mai mare
    }
    return gasit;
}
int main()
{   f>>N;
    int i,poz;
    for(i=1;i<=N;++i) f>>V[i];
    for(i=1;i<=N;++i)
    {   poz=cautare(V[i]); /// caut binar in Q cel mai mic element mai mare decat V[i]
        if(poz==-1) /// V[i] este mai mare decat toate elem. vect Q
        {   Q[++Q[0]]=V[i]; /// cresc dimensiunea subsirului maximal si pun V[i] in Q
            P[i]=Q[0]; /// setez faptul ca V[i] corespunde pozitiei Q[0]
        }
        else
        {   Q[poz]=V[i]; /// inlocuiesc elementul gasit mai mare cu V[i]
            P[i]=poz; /// setez faptul ca V[i] corespunde pozitiei poz
        }
    }
    g<<Q[0]<<'\n'; /// afisez dimensiunea
    int j=N;
    for(i=Q[0];i;--i) /// pentru fiecare pozitie a subsirului maximal
    {   while(i!=P[j]) j--;/// caut elementul ce corespunde pozitiei i
        SOL[i]=V[j]; /// il adaug in solutie
    }
    for(i=1;i<=Q[0];++i) g<<SOL[i]<<' ';
    g.close(); return 0;
}