Pagini recente » Cod sursa (job #23535) | Cod sursa (job #1788309) | Cod sursa (job #36333) | Cod sursa (job #2281213) | Cod sursa (job #1360251)
#include <iostream>
#include <fstream>
using namespace std;
int N, L, a[100001], prev[100001], last[100001];
ifstream f("scmax.in");
ofstream g("scmax.out");
void show(int ind)
{
if(prev[ind]) {
show(prev[ind]);
g<<a[ind]<<" ";
}
}
int main()
{
int i, j;
f >> N;
for(i = 1; i <= N; i++)
{
f >> a[i];
}
L = 1;
last[1] = 1; // last[i] reprezinta ultimul index in care se termina
// un subsir crescator maximal de lungime exact i
// parcurg sirul
for(i = 2; i <= N; i++)
{
// la fiecare pas, caut binar o pozitie in care elementul respectiv
// este mai mic decat elementul curent a[i]
int low = 1, high = L;
// L - este lungimea lui last
while(low <= high)
{
// aflam jumatatea
int mean = (low + high) / 2;
// daca elementul curent a[i] este mai mare decat jumatatea
// intervalului de indecsi in care caut
if(a[last[mean]] < a[i]) {
// ma duc sa caut in jumatatea dreapta
low = mean + 1;
} else {
// altfel in jumatatea stanga
high = mean - 1;
}
}
// daca elementul curent este mai mare decat toate elementele
// asociate indecsilor din array atunci inseamna ca trebuie
// sa cresc lungime solutiei curente
if(low == L + 1) {
L = L + 1;
}
// notez faptul ca ultimul sir de lungime low se termina pe
// pozitia i
last[low] = i;
// si leg acest element de subisrul crescator maximal ce se termina pe
// pozitia low -1
prev[i] = last[low - 1];
}
g<<L<<"\n";
show(last[L]);
return 0;
}