Pagini recente » Cod sursa (job #2338756) | Cod sursa (job #2596167) | Cod sursa (job #1499662) | Cod sursa (job #269763) | Cod sursa (job #1403176)
#include <iostream>
#include <vector>
#include <stack>
#include <cstdio>
#define nmax 100005
using namespace std;
int n, lenD;
FILE *fi, *fo;
int A[nmax], D[nmax];
vector <int> V[nmax];
stack <int> S;
int bs(int lo, int hi, int val)
{
if (lo > hi)
return hi;
int mid = (lo + hi) >> 1;
if (D[mid] < val && D[mid+1] >= val)
return mid;
if (D[mid] > val)
return bs(lo, mid - 1, val);
else
return bs(mid + 1, hi, val);
}
int main()
{
fi = fopen("scmax.in", "r");
fo = fopen("scmax.out", "w");
fscanf(fi, "%d", &n);
for (int i = 1; i <= n; i++)
fscanf(fi, "%d", &A[i]);
lenD = 0;
D[0] = -1;
for (int i = 1; i <= n; i++)
{
int pos = bs(1, lenD, A[i]);
D[pos+1] = A[i];
lenD = max(lenD, pos+1);
V[pos+1].push_back(i);
}
fprintf(fo, "%d\n", lenD);
int index = V[lenD][V[lenD].size()-1];
S.push(A[index]);
for (int i = lenD - 1; i > 0; i--)
for (int j = int(V[i].size())-1; j >= 0; j--)
if (V[i][j] < index)
{
index = V[i][j];
S.push(A[index]);
break;
}
while (S.size())
{
fprintf(fo, "%d ", S.top());
S.pop();
}
fclose(fi);
fclose(fo);
return 0;
}