Cod sursa(job #612704)

Utilizator alinhAlin H alinh Data 9 septembrie 2011 17:49:32
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#include <vector>
using namespace std;

void find_lis(vector<long> &a, vector<int> &b)
{
	vector<int> p(a.size());
	long u, v;

	if (a.empty()) return;

	b.push_back(0);

	for (size_t i = 1; i < a.size(); i++)
        {
		if (a[b.back()] < a[i])
                {
			p[i] = b.back();
			b.push_back(i);
			continue;
		}

		for (u = 0, v = b.size()-1; u < v;)
                {
			int c = (u + v) / 2;
			if (a[b[c]] < a[i]) u=c+1; else v=c;
		}


		if (a[i] < a[b[u]])
                {
			if (u > 0) p[i] = b[u-1];
			b[u] = i;
		}
	}

	for (u = b.size(), v = b.back(); u--; v = p[v]) b[u] = v;
}

ifstream fi;
ofstream fo;

vector<long> vec;
vector<int> sol;

int main()
{
    fi.open("scmax.in");
    int n;
    fi >> n;
    for (int i = 1; i <= n; i++)
    {
        int val;
        fi >> val;
        vec.push_back(val);
    }
    fi.close();

    find_lis(vec, sol);

    fo.open("scmax.out");
    fo << sol.size() << "\n";
    for (int i = 0; i < sol.size(); i++)
        fo << vec[sol[i]] << " ";
    fo.close();
	return 0;
}