Pagini recente » Cod sursa (job #1522892) | Cod sursa (job #2029961) | Cod sursa (job #2352091) | Cod sursa (job #1107518) | Cod sursa (job #2282043)
#include <fstream>
#include <iostream>
#define NUM 100005
using namespace std;
int v[NUM];
int indice_fin[NUM];
int indice_prec[NUM];
int n, lng;
ifstream f("scmax.in");
ofstream g("scmax.out");
void citire()
{
f >> n;
for(int i = 0; i < n; ++i)
f >> v[i];
}
void afisare(int indic)
{
if(indice_prec[indic] >= 0)
afisare(indice_prec[indic]);
//cout << indic << " ";
g << v[indic] << " ";
}
int ceil_poz(int st, int dr, int val)
{
int mij;
while(dr - st > 1)
{
mij = st + (dr - st) / 2;
if(v[indice_fin[mij]] >= val)
dr = mij;
else
st = mij;
}
return dr;
}
void solve()
{
for(int i = 0; i <= n; ++i)
indice_fin[i] = 0, indice_prec[i] = -1;
lng = 1;
int poz;
for(int i = 1; i < n; ++i)
{
// daca e mai mic decat primul element
if(v[i] < v[indice_fin[0]])
indice_fin[0] = i;
// daca e mai mare decat ultimul element
else if(v[i] > v[indice_fin[lng - 1]])
{
indice_prec[i] = indice_fin[lng - 1];
indice_fin[lng++] = i;
}
// il punem undeva in mijloc
else
{
poz = ceil_poz(0, lng - 1, v[i]);
indice_prec[i] = indice_fin[poz - 1];
indice_fin[poz] = i;
}
}
g << lng << "\n";
}
int main()
{
citire();
solve();
afisare(indice_fin[lng - 1]);
}