Cod sursa(job #2026902)

Utilizator AndreidgDragomir Andrei Valentin Andreidg Data 25 septembrie 2017 12:18:49
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
using namespace std;
const int N = 100005;
ifstream f("scmax.in");
ofstream g("scmax.out");

int n,k;
int v[N],poz[N],ant[N],lst[N];
void bin_search(int x,int p)
{
     int st,dr,mij;
     st = 1;
     dr = k;

     if(v[k]< x)
     {
        k++;
        v[k] = x;
        poz[k] = p;
        ant[k] = poz[k-1];
        lst[p] = poz[k-1];
        /*g<<k<<"\n";
        for(int i = 1; i<= k; i++)
        {
            g<<v[i]<<" ";
        }
        g<<"\n";*/
        return;
     }

     while(st<=dr)
     {
         mij = (st + dr) / 2;
         if(x <= v[mij])
         {
             dr = mij - 1;
         }
         else
         {
             st = mij + 1;
         }
     }
    //g<<st<<"\n";
     v[st] = x;
     poz[st] = p;
     ant[st] = poz[st-1];
     lst[p]  = poz[st-1];
    /*for(int i = 1; i<= k; i++)
    {
        g<<v[i]<<" ";
    }
    g<<"\n";*/
}
int main()
{
    f>>n;
    int x[N];
    for(int i = 1; i<= n; i++)
    {
        f>>x[i];
        bin_search(x[i],i);
    }
    g<<k<<"\n";
    int num = poz[k];
    //g<<poz[k]<<" "<<lst[num]<<"\n";
    int vect[N],i = 0;
    while(num != 0)
    {
        vect[k-i] = x[num];
        num = lst[num];
        i++;
    }
    for(int i = 1; i <= k; i++)
    {
        g<<vect[i]<<" ";
    }
    f.close();
    g.close();
    return 0;
}