Pagini recente » Cod sursa (job #673147) | Cod sursa (job #3219203) | Cod sursa (job #2175071) | Cod sursa (job #254465) | Cod sursa (job #1208298)
#include <fstream>
#define DIM 100010
using namespace std;
int V[DIM], T[DIM], L[DIM];
//L[i] = cea mai mica valoare in care se poate termina un sir de lungime i (de fapt L[i] = poZitia din V a unei astfel de valori)
int n, m, i, p, u, mid;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
void sol(int i) {
if (i) {
sol(T[i]);
fout<<V[i]<<" ";
}
}
int main() {
fin>>n;
for (i=1;i<=n;i++)
fin>>V[i];
m = 1;
L[1] = 1;
for (i=2;i<=n;i++) {
p = 1; //caut pozitia ultimei valori L[poz] din L pentru care V[i] > V[ L[poz] ]
u = m;
while (p<=u) {
mid = p+(u-p)/2;
if (V[ L[mid] ] >= V[i])
u = mid - 1;
else
p = mid + 1;
}
if (p > m) {
m++;
L[m] = i;
T[i] = L[p-1];
} else
if (V[ L[p] ] > V[i]) {
L[p] = i;
T[i] = L[p-1];
}
}
fout<<m<<"\n";
sol(L[m]);
return 0;
}