Cod sursa(job #710012)

Utilizator ZexonAvramita Teodor Zexon Data 8 martie 2012 19:43:20
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

using namespace std;
int v[100001];
int n;
ifstream in("scmax.in");
ofstream out("scmax.out");
pair <int,int> dinamic[100001];
int prev[100001],nr;

int cauta(int x)//// cel mai mare x la care putem lipii(si primul)
{
    int i,pas=1<<16;
    for(i=0;pas!=0;pas/=2)
    {
        if(i+pas<=nr&&dinamic[i+pas].first<x)
            i+=pas;
    }
    return i;
}

void dinamica1()
{
    int j;
    dinamic[++nr].second = 1;
    dinamic[nr].first = v[1];
    for(int i=2;i<=n;i++)
    {
        j=cauta(v[i]);
        dinamic[j+1].first=v[i];
        dinamic[j+1].second=i;
        prev[i] = dinamic[j].second;
        if(j==nr) nr++;
    }
}

void refac(int p)
{
    if(prev[p]) refac(prev[p]);
    out << v[p] << " ";
}

void reasamblare()
{
    out << nr << "\n";
    int show = dinamic[nr].second;
    refac(show);
    /*
    while(show>0)
    {
      out << v[show] << " ";
      show = prev[show] ;
    }
    */
}


int main()
{
    string tmp;
    in>>tmp;
    n=atoi(tmp.c_str());
    for (int i =1;i<=n;i++)
    {
        in>>tmp;
        v[i]=atoi(tmp.c_str());
    }
    dinamica1();
    reasamblare();
    return 0;
}