Cod sursa(job #1210937)

Utilizator fromzerotoheroFROM ZERO fromzerotohero Data 21 iulie 2014 17:32:19
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
// S[i] - cea mai mica valoare care poate sa fie finalul unui
//        subsir crescator de i elemente

// 24 12 15 15 19

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define INF 1<<30
#define nmax 100001

int n,i,dr,poz;
int a[nmax],s[nmax],inv[nmax];
vector <int> lista[nmax];

int caut_bin(int st, int dr, int val)
{
    while(st<dr)
    {
        int mid=(st+dr)/2;
        if(s[mid]<val && s[mid+1]>=val)
            return mid;
        if(s[mid]<val)
            st=mid+1;
        else
            dr=mid-1;
    }
    return st;
}

int main() {
    
    fin>>n;
    for(i=1;i<=n;i++)
    {
        fin>>a[i];
    }
    for(i=1;i<=n;i++)
    {
        s[i]=INF;
    }
    
    s[0]=-INF;
    dr=0;
    for(i=1;i<=n;i++)
    {
        poz=caut_bin(0, dr, a[i]);
        lista[poz+1].push_back(i);
        s[poz+1]=a[i];
        dr=max(dr, poz+1);
        //cout<<poz<<" ";
    }
    fout<<dr<<"\n";
    int j,k=0;
    int ind=lista[dr][lista[dr].size()-1];
    for (i=dr-1; i>=1; i--) {
        for(j=lista[i].size()-1;j>=0;j--)
        {
            if(lista[i][j]<ind)
            {
                
                inv[++k] = a[ind];
                ind=lista[i][j];
                break;
            }
        }
    }
    inv[++k] = a[ind];
    
    for (i=k; i>0; i--)
        fout << inv[i] << " ";
    
    return 0;
}