Pagini recente » Cod sursa (job #2301606) | Cod sursa (job #513559) | Cod sursa (job #1218509) | Cod sursa (job #2598161) | Cod sursa (job #2554381)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n, i;
int poz, val;
int start, finish, maxim;
int best[262144], best1[100001];
int init[100001], aux[100001];
pair < int, int > v[100001];
bool cmp(pair < int, int > a, pair < int, int > b)
{
if (a.first < b.first)
return true;
if (a.first == b.first && a.second > b.second)
return true;
return false;
}
void update(int nod, int st, int dr)
{
if (st == dr)
{
best[nod] = val;
best1[poz] = val;
return;
}
int mij = (st + dr) / 2;
if (poz <= mij)
update(nod * 2, st, mij);
else
update(nod * 2 + 1, mij + 1, dr);
best[nod] = max(best[nod * 2], best[nod * 2 + 1]);
}
void query(int nod, int st, int dr)
{
if (start <= st && dr <= finish)
{
maxim = max(maxim, best[nod]);
return;
}
int mij = (st + dr) / 2;
if (mij >= start)
query(nod * 2, st, mij);
if (mij < finish)
query(nod * 2 + 1, mij + 1, dr);
}
void afisare(int poz, int val, int last)
{
while (poz > 0 && (best1[poz] != val || init[poz] >= last))
poz--;
if (val > 1)
afisare(poz, val - 1, init[poz]);
g << init[poz] << " ";
}
int main()
{
f >> n;
for (i=1; i<=n; i++)
{
f >> init[i];
v[i].first = init[i];
v[i].second = i;
}
sort(v+1, v+n+1, cmp);
for (i=1; i<=n; i++)
{
start = 1, finish = v[i].second - 1, maxim = 0;
if (start <= finish)
query(1, 1, n);
poz = v[i].second;
val = maxim + 1;
update(1, 1, n);
}
g << best[1] << "\n";
afisare(n, best[1], v[n].first + 1);
return 0;
}