Cod sursa(job #1494754)

Utilizator gabi.cristacheGabi Cristache gabi.cristache Data 1 octombrie 2015 20:51:19
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <vector>

#define MaxN 100005

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

vector<int> mylist;
int v[MaxN], TT[MaxN], best[MaxN];



int mybsearch(int x) {
    int l = 1, u = mylist.size() - 1;

    while (l <= u) {
        int mid = l + (u - l) / 2;
        if (v[mylist[mid - 1]] < x && x <= v[mylist[mid]]) {
            return mid;
        } else if (x < v[mylist[mid - 1]]) {
            u = mid - 1;
        } else {
            l = mid + 1;
        }
    }
    return mylist.size();
}

void show(int i) {
    if (TT[i] != 0)
        show(TT[i]);
    fout << v[i] << ' ';
}

int main()
{
    int N, x;
    fin >> N;

    mylist.push_back(0);


    for (int i = 1; i <= N; ++i) {
        fin >> x;

        v[i] = x;

        int poz = mybsearch(x);
        if (poz == mylist.size())
            mylist.push_back(i);
        else
            mylist[poz] = i;

        best[i] = poz;
        TT[i] = mylist[poz - 1];
    }

    int maxBest = 0, maxIndex = 0;

    for (int i = 1; i <= N; ++i)
        if (maxBest < best[i])
            maxBest = best[i], maxIndex = i;

    fout << maxBest << '\n';
    show(maxIndex);

    return 0;
}