Cod sursa(job #1211343)

Utilizator fromzerotoheroFROM ZERO fromzerotohero Data 22 iulie 2014 13:44:43
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
// S[i] - cea mai mica valoare care poate sa fie finalul unui
//        subsir crescator de i elemente
#include <iostream>
#include <fstream>
using namespace std;

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

int n,i;
int hi = 0,poz;
int A[nmax],S[nmax];

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

int main() {
    
    fin >> n;
    
    for (i=1; i<=n; i++)
        fin >> A[i],
        S[i] = inf;
    
    S[0] = -inf;

    for (i=1; i<=n; i++) {
        
        poz = caut_bin(0, hi, A[i]);
        S[poz+1] = A[i];
        hi = max(hi, poz+1);
        
    }
    
    fout << hi << "\n";
    
    for (i=1; i<=hi; i++)
        fout << S[i] << " ";
    
    return 0;
}