Pagini recente » Cod sursa (job #1393568) | Cod sursa (job #922834) | Cod sursa (job #784252) | Cod sursa (job #1795372) | Cod sursa (job #2771671)
#include <iostream>
#include <fstream>
#define NMAX 100000
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int binary_leftmost(int a[], int spoz[], int k, int inc, int sf)
{
int st = inc - 1, dr = sf, mij;
while (dr - st > 1)
{
mij = st + (dr - st) / 2;
if (k > a[spoz[mij]])
st = mij;
else dr = mij;
}
return dr;
}
int spoz[NMAX], ans[NMAX], a[NMAX], n, k, lung, rasp[NMAX];
int main ()
{
fin >> n;
for (int i = 0; i < n; i++)
fin >> a[i], ans[i] = -1;
spoz[0] = 0;
lung = 1;
for (int i = 1; i < n; i++)
{
if(a[i] < a[spoz[0]])
spoz[0] = i;
else if (a[i] > a[spoz[lung - 1]])
{
ans[i] = spoz[lung - 1];
spoz[lung++] = i;
}
else
{
k = binary_leftmost(a, spoz, a[i], 0, lung - 1);
// k = GetPosition(a, spoz, -1, lung - 1, a[i]);
ans[i] = spoz[k - 1];
spoz[k] = i;
}
}
fout << lung << endl;
k = spoz[lung - 1];
for (int i = 0; i < lung; i++)
{
rasp[i] = a[k];
k = ans[k];
}
for (int i = lung - 1; i >= 0; i--)
fout << rasp[i] << " ";
fin.close();
fout.close();
return 0;
}