Pagini recente » Cod sursa (job #346351) | Cod sursa (job #347289) | Cod sursa (job #2908073) | Cod sursa (job #2357801) | Cod sursa (job #2948388)
#include <fstream>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
struct elem
{
int lungMax, nod;
} BIT[100005];
stack<int> ans;
int n, numbers[100005], indexes[100005], tata_de[100005];
int getLSB(int x)
{
return (x & (-x));
}
void setValue(int x, int poz)
{
int cPoz = poz;
for (; cPoz <= n; cPoz += getLSB(cPoz))
{
if (BIT[cPoz].lungMax < x)
{
BIT[cPoz].lungMax = x;
BIT[cPoz].nod = poz;
}
}
}
elem getValue(int poz)
{
elem ans = {0, 0};
for (; poz > 0; poz -= getLSB(poz))
{
if (ans.lungMax < BIT[poz].lungMax)
ans = BIT[poz];
}
return ans;
}
bool compareIndexes(int x, int y)
{
return numbers[x] < numbers[y];
}
int main()
{
fin >> n;
for (int i = 1; i <= n; i++)
{
fin >> numbers[i];
indexes[i] = i;
if (i > 1 && numbers[i] == numbers[i-1])
i--, n--;
}
sort(indexes + 1, indexes + 1 + n, compareIndexes);
for (int i = 1; i <= n; i++)
{
if (i == 1)
{
setValue(1, indexes[i]);
continue;
}
elem ans = getValue(indexes[i] - 1);
tata_de[indexes[i]] = ans.nod;
setValue(ans.lungMax + 1, indexes[i]);
}
fout << BIT[n].lungMax << "\n";
int header = BIT[n].nod;
while (header)
{
ans.push(numbers[header]);
header = tata_de[header];
}
while (!ans.empty())
{
fout << ans.top() << " ";
ans.pop();
}
fout << "\n";
return 0;
}