Pagini recente » Cod sursa (job #2602469) | Cod sursa (job #209211) | Cod sursa (job #2412930) | Cod sursa (job #1553569) | Cod sursa (job #1149743)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int i, n, poz[100001], r, in, sf, j, coada[100001];
struct numere {
int val, nxt, lg;
};
numere v[100001];
int CB(int in, int sf, int nr);
int main() {
FILE *fin = fopen("scmax.in","r");
FILE *fout = fopen("scmax.out","w");
fscanf(fin, "%d", &n);
for(i = 1;i <= n;i++) {
fscanf(fin, "%d", &v[i].val);
}
in = 1;
sf = 0;
for(i = n;i >= 1;i--) {
r = CB(in, sf, v[i].val);
if(r == -1) {
r = 1;
poz[r] = i;
}
else {
while(v[poz[r]].val > v[i].val) {
r++;
}
if(v[poz[r]].val < v[i].val) {
poz[r] = i;
}
}
v[i].lg = r;
v[i].nxt = poz[r - 1];
++sf;
while(poz[sf] != 0) sf++;
--sf;
}
coada[0] = 0;
i = poz[sf];
j = 1;
while(j <= sf) {
coada[++coada[0]] = v[i].val;
j++;
i = v[i].nxt;
if(coada[0] > 1 && coada[coada[0]] <= coada[coada[0] - 1]) coada[0]--;
}
fprintf(fout, "%d\n", coada[0]);
for(i = 1;i <= coada[0];i++) {
fprintf(fout, "%d ", coada[i]);
}
fclose(fin);
fclose(fout);
return 0;
}
int CB(int in, int sf, int nr) {
if(in > sf) return -1;
if(sf - in <= 1) return sf;
int mij;
mij = (in + sf) / 2;
if(v[poz[mij]].val > nr) {
return CB(mij, sf, nr);
}
else {
if(v[poz[mij]].val < nr) {
return CB(in, mij, nr);
}
else return mij;
}
}