Pagini recente » Cod sursa (job #1847466) | Cod sursa (job #638991) | Cod sursa (job #1060238) | Cod sursa (job #1460769) | Cod sursa (job #2843466)
#include <stdio.h>
int n, v[100003], tailIndices[100003], prevIndices[100003];
int GetCeilIndex(int l, int r, int key) {
int m = (l + r) / 2;
while(l <= r) {
if (v[tailIndices[m]] < key && v[tailIndices[m + 1]] >= key) return m + 1;
else if (v[tailIndices[m + 1]] < key) {l = m + 1; m = (l + r)/2;}
else {r = m - 1; m = (l + r) / 2;}
}
}
void print(int index) {
if(prevIndices[index] > 0) print(prevIndices[index]);
printf("%d ", v[index]);
}
void LongestIncreasingSubstring() {
int i, len, pos;
for (i = 0; i <= n; i++) {
prevIndices[i] = -1;
}
len = 1;
for (i = 1; i <= n; i++) {
if (v[i] < v[tailIndices[0]]) {
//new smallest value
tailIndices[0] = i;
} else if (v[i] > v[tailIndices[len-1]]) {
//v[i] wants to extend
//largest subsequence
prevIndices[i] = tailIndices[len-1];
tailIndices[len] = i;
len++;
} else {
//v[i] wants to be a
//potential condidate of
//future subsequence
//It will replace ceil
//value in tailIndices
pos = GetCeilIndex(-1, len - 1, v[i]);
prevIndices[i] = tailIndices[pos-1];
tailIndices[pos] = i;
}
}
printf("%d\n", len - 1);
print(tailIndices[len - 1]);
}
int main() {
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int i;
scanf("%d", &n);
for (i = 1; i <= n; i++){scanf("%d", &v[i]);}
LongestIncreasingSubstring();
return 0;
}