Pagini recente » Cod sursa (job #2093624) | Cod sursa (job #1065018) | Cod sursa (job #827512) | Cod sursa (job #2154539) | Cod sursa (job #1181912)
#include <fstream>
#define DIM 100010
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int d[DIM], v[DIM], n, i, k, p, u, mid, t[DIM];
void drum(int u) {
if (u!=0) {
drum(t[u]);
fout<<v[u]<<" ";
}
}
int main() {
fin>>n;
for (i=1;i<=n;i++) {
fin>>v[i];
}
k = 1;
d[1] = 1; // d[k] = cea mai mica valoare in care se termina un subsir de lungime k
// folosind primele i elemente din v, de fapt pozitia din v a acestei valori
for (i=2;i<=n;i++) {
// caut pe v[i] in d pe pozitii de la 1 la k
p = 1;
u = k;
while (p<=u) {
mid = p + (u-p)/2;
if (v[ d[mid] ] >= v[i])
u = mid-1;
else
p = mid+1;
}
if (p > k) {
d[++k] = i;
t[i] = d[p-1];
} else
if (v[i] < v[ d[p] ]) {
d[p] = i;
t[i] = d[p-1];
}
}
fout<<k<<"\n";
drum(d[k]);
return 0;
}