Pagini recente » Cod sursa (job #384608) | Cod sursa (job #2987975) | Cod sursa (job #264981) | Cod sursa (job #2095061) | Cod sursa (job #2805829)
#include <fstream>
#define N 100002
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int lg[N], sol[N], nr, v[N], pred[N];
void afis(int poz)
{
if (poz)
{
afis(pred[poz]);
g << v[poz] << ' ';
}
}
int dinamica(int x)
{
if (nr == 0 || v[sol[nr]] < x)
{
++nr;
return nr;
}
else
{
int st = 1, dr = nr, mij;
int poz = 0;///NU UITA de initializarea asta!!!!
while (st <= dr)
{
mij = (st + dr) / 2;
if (v[sol[mij]] < x)
poz = mij, st = mij + 1;
else
dr = mij - 1;
}
return poz + 1;
}
}
int main()
{
int n, x, poz, ma = 0, st;
f >> n;
for (int i = 1;i <= n;++i)
{
f >> x, v[i] = x;
poz = dinamica(x);
sol[poz] = i;
lg[i] = lg[sol[poz - 1]] + 1;
pred[i] = sol[poz - 1];
if (lg[i] > ma)
ma = lg[i], st = i;
}
g << ma << "\n";
afis(st);
f.close();
g.close();
return 0;
}