Cod sursa(job #1403176)

Utilizator andreiblaj17Andrei Blaj andreiblaj17 Data 27 martie 2015 08:38:10
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <vector>
#include <stack>
#include <cstdio>
#define nmax 100005

using namespace std;

int n, lenD;
FILE *fi, *fo;
int A[nmax], D[nmax];
vector <int> V[nmax];
stack <int> S;

int bs(int lo, int hi, int val)
{
    if (lo > hi)
        return hi;
    int mid = (lo + hi) >> 1;
    if (D[mid] < val && D[mid+1] >= val)
        return mid;
    if (D[mid] > val)
        return bs(lo, mid - 1, val);
    else
        return bs(mid + 1, hi, val);
}

int main()
{
    
    fi = fopen("scmax.in", "r");
    fo = fopen("scmax.out", "w");
    
    fscanf(fi, "%d", &n);
    
    for (int i = 1; i <= n; i++)
        fscanf(fi, "%d", &A[i]);
    
    lenD = 0;
    D[0] = -1;
    
    for (int i = 1; i <= n; i++)
    {
        int pos = bs(1, lenD, A[i]);
        D[pos+1] = A[i];
        lenD = max(lenD, pos+1);
        
        V[pos+1].push_back(i);
    }
    
    fprintf(fo, "%d\n", lenD);
    
    int index = V[lenD][V[lenD].size()-1];
    
    S.push(A[index]);
    
    for (int i = lenD - 1; i > 0; i--)
        for (int j = int(V[i].size())-1; j >= 0; j--)
            if (V[i][j] < index)
            {
                index = V[i][j];
                S.push(A[index]);
                break;
            }
    
    while (S.size())
    {
        fprintf(fo, "%d ", S.top());
        S.pop();
    }
    
    
    fclose(fi);
    fclose(fo);
    
    return 0;
}