Pagini recente » Cod sursa (job #14353) | Cod sursa (job #286239) | Cod sursa (job #1123312) | Cod sursa (job #2020380) | Cod sursa (job #2868918)
#include <bits/stdc++.h>
using namespace std;
int a[100003], P[100003], n, sol[100003];
int cap[100003], nr_siruri;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
/**
cap[i] = capatul minim
P[i] = pozitia in care se depune valoarea a[i] in cap[]
*/
void CautBin(int i)
{
int st, dr, p, mij, x = a[i];
if (x <= cap[1])
{
cap[1] = x;
P[i] = 1;
return;
}
if (x > cap[nr_siruri])
{
nr_siruri++;
cap[nr_siruri] = x;
P[i] = nr_siruri;
return;
}
/// caut cea mai din stanga poz. p cu a[i] <= cap[p]
st = 1; dr = nr_siruri; p = nr_siruri;
while (st <= dr)
{
mij = (st + dr) / 2;
if (x <= cap[mij])
{
p = mij;
dr = mij - 1;
}
else st = mij + 1;
}
cap[p] = x;
P[i] = p;
}
int main()
{
int i, j, len, ult;
fin >> n;
for (i = 1; i <= n; i++)
fin >> a[i];
cap[1] = a[1];
P[1] = 1;
nr_siruri = 1; /// lungimea lui cap[]
for (i = 2; i <= n; i++)
CautBin(i);
fout << nr_siruri << "\n";
ult = 2e9 + 1;
j = 0;
for (len = nr_siruri, i = n; i >= 1 && len > 0; i--)
if (P[i] == len && a[i] < ult)
{
ult = a[i];
sol[++j] = a[i];
len--;
}
for (i = nr_siruri; i >= 1; i--)
fout << sol[i] << " ";
fout.close();
return 0;
}