Pagini recente » Cod sursa (job #1653889) | Cod sursa (job #1774214) | Cod sursa (job #1839129) | Cod sursa (job #2579040) | Cod sursa (job #1770914)
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/*
* File: main.cpp
* Author: octavian
*
* Created on 04 October 2016, 18:10
*/
#include <cstdlib>
#include <cstdio>
using namespace std;
const int NMAX = 100005;
const int INF = 2000000005;
int a[NMAX];
int X[NMAX];
int pred[NMAX];//remembers predecessors for a position, because values are not unique
int res[NMAX];
int longest = 0;
FILE *fin = fopen("scmax.in", "r");
FILE *fout = fopen("scmax_1.in", "w");
int bSearchLarger(int start, int end, int x) {
int pos = 0;
int pow = 1;
while((pow << 1) <= end) {
pow <<= 1;
}
// fprintf(fout, "pos is %d\n", pow);
while(pow > 0) {
if(x > a[X[pos + pow]] && pos + pow <= end) {
pos += pow;
}
pow >>= 1;
}
return pos;
}
/*
*
*/
int main(int argc, char** argv) {
int N;
fscanf(fin, "%d", &N);
for(int i = 1 ; i <= N ; i++) {
fscanf(fin, "%d", &a[i]);
}
a[0] = INF;
for(int i = 1 ; i <= N ; i++) {
int longestString = bSearchLarger(1, longest, a[i]);
// fprintf(fout, "longestString: %d\n", longestString);
if(a[i] < a[X[longestString + 1]]) {
X[longestString + 1] = i;
// fprintf(fout, "X[longestString + 1]: %d, %d\n", X[longestString + 1], a[X[longestString + 1]]);
pred[X[longestString + 1]] = X[longestString];
// fprintf(fout, "pred of %d is %d\n", X[longestString + 1], X[longestString]);
if(longestString + 1 > longest) {
longest = longestString + 1;
}
}
}
fprintf(fout, "%d\n", longest);
int pos = X[longest];
for(int i = longest ; i ; i--) {
res[i] = a[pos];
pos = pred[pos];
}
for(int i = 1 ; i <= longest ; i++) {
fprintf(fout, "%d ", res[i]);
}
fclose(fin);
fclose(fout);
return 0;
}