Pagini recente » Cod sursa (job #1449619) | Cod sursa (job #1029253) | Cod sursa (job #1648834) | Cod sursa (job #873973) | Cod sursa (job #2105258)
#include <iostream>
#include <fstream>
#define NMAX 100001
using namespace std;
int a[NMAX], n;
int lung[NMAX], pred[NMAX];
int l[NMAX];
void read() {
ifstream in("scmax.in");
in >> n;
for (int i = 1; i <= n; i++)
in >> a[i];
in.close();
}
int binary(int left, int right, int value) {
int mid;
while (left <= right) {
mid = left + (right - left) / 2;
if (a[l[mid]] < value && (a[l[mid + 1]] >= value || mid == right))
return l[mid];
if (a[l[mid]] >= value)
right = mid - 1;
else
left = mid + 1;
}
return 0;
}
ofstream out("scmax.out");
void print(int i) {
if (i != 0) {
print(pred[i]);
out << a[i] << " ";
}
}
int main() {
read();
int maxL = 0, pos, posMax = 0;
for (int i = 1; i <= n; i++) {
pos = binary(1, maxL, a[i]);
lung[i] = lung[pos] + 1;
pred[i] = pos;
if (lung[i] == maxL + 1 || a[i] < a[l[lung[i]]])
l[lung[i]] = i;
if (lung[i] == maxL + 1)
maxL++;
if (lung[posMax] < lung[i])
posMax = i;
}
out << lung[posMax] << "\n";
print(posMax);
out.close();
return 0;
}