Pagini recente » Cod sursa (job #1936951) | Cod sursa (job #562079) | Cod sursa (job #437051) | Cod sursa (job #2940114) | Cod sursa (job #2672944)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int Nmax = 1e5 + 5;
int D[Nmax],//un elemet al sirului V in care se termina sclm de lungime k
V[Nmax],
P[Nmax],//pozitia elementului adaugat sau inlocuit din D
I[Nmax],//sclm
k, n;// k = lungimea sirului;
void caut_binar(int st, int dr, int& p, int x)
{
while(st <= dr)
{
int m = st + (dr - st)/2;
if(D[m] >= x)
p = m, dr = m - 1;
else
st = m + 1;
}
}
int main()
{
in>>n;
for(int i = 1; i <= n; i++)
in>>V[i];
k = 1, D[k] = V[1], P[1] = 1;
for(int i = 2; i <= n; i++)
if(V[i] > D[k])
D[++k] = V[i], P[i] = k;
else
{
int p; // pozitia elementului cel mai mic din D, mai mare decat A
caut_binar(1, k, p, V[i]);
D[p] = V[i];
P[i] = p;
}
out<<k<<'\n';
int j = n;
for(int i = k; i >= 1; i--)
{
while(P[j] != i)
j--;
I[i] = j;
}
for(int i = 1; i <= k; i++)
out<<V[I[i]]<<' ';
}