Pagini recente » Cod sursa (job #154660) | Cod sursa (job #1168123) | Cod sursa (job #2775418) | Cod sursa (job #1584141) | Cod sursa (job #2569360)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, u, p, m;
int v[100005];
int L[100005];
int T[100005];
void sol(int i) {
if (i) {
sol(T[i]);
fout << v[i] << " ";
}
}
int main() {
fin >> n;
for (int i=1;i<=n;++i) fin >> v[i];
m = 1; /// lungimea subsirului
L[1] = 1;
for (int i=2;i<=n;++i) {
p = 1; /// st
u = m; /// dr
/// caut pozitia urmatoarei valori mai mari decat a ultimei din subsir
while(p<=u) {
int mid = p+(u-p)/2;
if (v[ L[mid] ] >= v[i])
u = mid - 1;
else
p = mid + 1;
}
if (p > m) { /// a gasit, o pune in subsir
m++;
L[m] = i;
T[i] = L[p-1];
} else { /// o updateaza
L[p] = i;
T[i] = L[p-1];
}
}
fout<<m<<"\n";
sol(L[m]);
}