Pagini recente » Cod sursa (job #2853403) | Cod sursa (job #2510213) | Cod sursa (job #1129493) | Cod sursa (job #2129534) | Cod sursa (job #813463)
Cod sursa(job #813463)
#include <cstdio>
FILE* in;
FILE* out;
template<class T>
int binary_search(T* v, int *index, int a, int b, const T& value) {
if(a == b) {
return (!(v[index[a]] < value))?(a):(a + 1);
}
int mid = (a + b) / 2;
if(v[index[mid]] < value) {
return binary_search(v, index, mid + 1, b, value);
}
else {
return binary_search(v, index, a, mid, value);
}
}
/*
* Functia care determina un subsir crescator maximal dintr-un vector
*/
void scmax(int *v, int &n) {
int j;
int *best = new int[n + 1];
int *m = new int[n];
int *prev = new int[n + 1];
int jmax = 0;
best[1] = 1;
prev[1] = 0;
m[0] = 0;
int imax = 1;
for(int i = 1; i <= n; ++i) {
j = binary_search(v, m, 0, imax, v[i]);
best[i] = j;
if(best[i] > best[jmax])
jmax = i;
prev[i] = m[j - 1];
m[j] = i;
if(j > imax)
imax++;
}
int *rez = new int[imax + 1];
j = 0;
rez[j++] = jmax;
for(int i = jmax; prev[i]; i = prev[i]) {
rez[j] = prev[i];
j++;
}
fprintf(out, "%d\n", imax - 1);
for(int i = j - 1; i >= 0; --i)
fprintf(out, "%d ", v[rez[i]]);
fprintf(out, "\n");
}
int main() {
//FILE *in = fopen(argv[0], "r");
//FILE *out = fopen(argv[1], "w");
in = fopen("scmax.in", "r");
out = fopen("scmax.out", "w");
int n;
fscanf(in, "%d", &n);
int *price = new int[n + 1];
for(int i = 1; i <= n; ++i) {
fscanf(in, "%d", price + i);
}
scmax(price, n);
fclose(in);
fclose(out);
return 0;
}