Pagini recente » Cod sursa (job #1384464) | Cod sursa (job #1825680) | Cod sursa (job #681293) | Cod sursa (job #485185) | Cod sursa (job #2171699)
#include <bits/stdc++.h>
#define NMax 100006
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
int a[NMax], lis[NMax], poz[NMax], drum[NMax];
int n, K;
inline void Citire()
{
int i;
fin >> n;
for(i = 1; i <= n; i++)
fin >> a[i];
}
int CautBin(int x)
{
int st = 1, dr = K, mid, sol = K;
while(st <= dr)
{
mid = (st + dr) / 2;
if(x <= lis[mid])
{
sol = mid;
dr = mid - 1;
}
else
st = mid + 1;
}
return sol;
}
inline void LIS()
{
int i, x, p;
lis[1] = a[1];
K = 1;
poz[1] = 1;
for(i = 2; i <= n; i++)
{
x = a[i];
if(x > lis[K])
{
lis[++K] = x;
poz[i] = K;
}
else
if(lis[1] >= x)
{
lis[1] = x;
poz[i] = 1;
}
else
{
p = CautBin(x);
lis[p] = x;
poz[i] = p;
}
}
}
inline void Afisare()
{
int i, P = K;
fout << K << "\n";
for(i = n; i >= 1 && P != 0; i--)
if(poz[i] == P)
{
drum[P] = a[i];
P--;
}
for(i = 1; i <= K; i++)
fout << drum[i] << " ";
fout << "\n";
}
int main()
{
Citire();
LIS();
Afisare();
return 0;
}