Pagini recente » Cod sursa (job #2676106) | Cod sursa (job #2061495) | Cod sursa (job #2831093) | Cod sursa (job #1363504) | Cod sursa (job #413715)
Cod sursa(job #413715)
#include <fstream>
#include <stdlib.h>
#include <limits.h>
using namespace std;
ifstream in ("scmax.in");
ofstream out("scmax.out");
struct item {
int val;
int idx;
};
int fcmp(const void* x,const void* y) {
int rez = ((item*)x)->val - ((item*)y)->val;
if (rez == 0)
rez = ((item*)x)->idx - ((item*)y)->idx;
return rez;
}
item* elem;
int main() {
int n, x;
in >> n;
elem = new item[n];
for (int i = 0; i < n; i++) {
in >> x;
elem[i].val = x;
elem[i].idx = i;
}
item* elem2 = new item[n];
for (int i = 0; i < n; i++)
elem2[i] = elem[i];
qsort(elem, n, sizeof(item), fcmp);
item* aux = new item[n];
for (int i = 0; i < n; i++) {
aux[i].val = elem[i].idx;
aux[i].idx = i;
}
qsort(aux, n, sizeof(item), fcmp);
int max = 1, crtMax = 1, idx = 0, crtIdx = 0;
for (int i = 1; i < n; i++) {
if (aux[i - 1].idx < aux[i].idx) {
crtMax++;
}
else {
if (crtMax > max) {
max = crtMax;
idx = crtIdx;
}
crtMax = 1;
crtIdx = i;
}
}
if (crtMax > max) {
max = crtMax ;
idx = crtIdx;
}
int oldVal = elem2[aux[idx].val].val;
int crtVal;
int max2 = max;
for (int i = 1; i < max2 ; i++) {
crtVal = elem2[aux[idx + i].val].val;
if (crtVal == oldVal) {
max--;
}
oldVal = crtVal;
}
out << max << "\n";
oldVal = elem2[aux[idx].val].val;
out << oldVal << " ";
int j = 1;
for (int i = 1; j < max ; i++) {
crtVal = elem2[aux[idx + i].val].val;
if (crtVal != oldVal) {
out << crtVal << " ";
oldVal = crtVal;
j++;
}
}
return 0;
}