Pagini recente » Cod sursa (job #1713039) | Cod sursa (job #2689151) | Cod sursa (job #1488276) | Cod sursa (job #2033481) | Cod sursa (job #1310284)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#define nmax 100005
#define inf 1<<30
using namespace std;
int n;
int sizeOfLS;
int A[nmax], LS[nmax];
vector <int> V[nmax];
stack <int> S;
int searchLS(int st, int dr, int value) {
int mid;
while (st < dr) {
mid = (st + dr) >> 1;
if (LS[mid] < value && value <= LS[mid+1])
return mid;
if (LS[mid] < value)
st = mid + 1;
else
dr = mid - 1;
}
return dr;
}
int main() {
ifstream fin("scmax.in");
ofstream fout("scmax.out");
fin >> n;
for (int i = 1; i <= n; i++) {
fin >> A[i];
LS[i] = inf;
}
sizeOfLS = 0;
LS[0] = -inf;
for (int i = 1; i <= n; i++) {
int poz = searchLS(0, sizeOfLS, A[i]);
LS[poz+1] = A[i];
sizeOfLS = max(sizeOfLS, poz+1);
V[poz+1].push_back(i);
}
fout << sizeOfLS << "\n";
int indexA = V[sizeOfLS][V[sizeOfLS].size()-1];
S.push(A[indexA]);
for (int i = sizeOfLS - 1; i > 0; i--)
for (int j = V[i].size() - 1; j >= 0; j--)
if (V[i][j] < indexA) {
indexA = V[i][j];
S.push(A[indexA]);
break;
}
while (!S.empty()) {
fout << S.top() << " ";
S.pop();
}
fout << "\n";
fin.close();
fout.close();
return 0;
}