Pagini recente » Cod sursa (job #1877840) | Cod sursa (job #1016774) | Diferente pentru implica-te/arhiva-educationala intre reviziile 36 si 37 | Cod sursa (job #166840) | Cod sursa (job #813414)
Cod sursa(job #813414)
#include <cstdio>
#include <queue>
#include <utility>
#include <algorithm>
using namespace std;
template<class T>
bool min(const T& a, const T& b) {
return ((a < b)?a:b);
}
template<class T1, class T2>
bool operator<(const pair<T1, T2> &p1, const pair<T1, T2> &p2) {
return (p1.first < p2.first);
}
template<class T>
int binary_search(T* first, int a, int b, const T& value) {
if(a == b) {
return (!(first[a] < value))?(a):(a + 1);
}
int mid = (a + b) / 2;
if(first[mid] < value) {
return binary_search(first, mid + 1, b, value);
}
else {
return binary_search(first, a, mid, value);
}
}
/*
* Functia care determina un subsir crescator maximal dintr-un vector
*/
int* scmax(int *v, int &n) {
int j;
int *best = new int[n];
int *m = new int[n];
int nmax;
best[0] = 1;
m[0] = 0;
int imax = 0;
for(int i = 0; i < n; ++i) {
j = binary_search(m, 0, imax, v[i]);
fprintf(stderr, "Punem %d la %d\n", v[i], j);
m[j] = v[i];
best[i] = j;
if(j > imax)
imax++;
}
delete m;
return best;
}
void afis(int *v, int n) {
for(int i = 0; i < n; ++i)
fprintf(stderr, "%d ", v[i]);
fprintf(stderr, "\n");
}
int main(int argc, char **argv) {
argc--;
argv++;
//FILE *in = fopen(argv[0], "r");
//FILE *out = fopen(argv[1], "w");
FILE *in = fopen("scmax.in", "r");
FILE *out = fopen("scmax.out", "w");
int n;
fscanf(in, "%d", &n);
int *price = new int[n];
for(int i = 0; i < n; ++i) {
fscanf(in, "%d", price + i);
}
int *scm = scmax(price, n);
int *rez = new int[n];
int j = 0;
int imax = 0;
for(int i = 0; i < n; ++i) {
if(scm[i] > scm[imax])
imax = i;
}
int prev = scm[imax];
for(int i = n - 1; i >= 0; --i) {
if(scm[i] == prev) {
rez[j] = i;
j++;
prev--;
}
}
fprintf(out, "%d\n", j);
for(int i = j - 1; i >= 0; --i)
fprintf(out, "%d ", price[rez[i]]);
fprintf(out, "\n");
fclose(in);
fclose(out);
return 0;
}