Pagini recente » Cod sursa (job #2842593) | Cod sursa (job #936491) | Cod sursa (job #1130648) | Cod sursa (job #1288739) | Cod sursa (job #3248068)
#include <fstream>
#include <stack>
using namespace std;
const int NMAX = 1e5 + 1;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, a[NMAX], d[NMAX], poz[NMAX], lg;
int cb(int x)
{
int st = 1, dr = lg, mij, sol = 0;
while(st <= dr)
{
mij = (st + dr) / 2;
if(d[mij] > x)
{
sol = mij;
dr = mij - 1;
}
else
st = mij + 1;
}
d[sol] = x;
return sol;
}
int main()
{
int x;
fin >> n >> x;
d[++lg] = a[1] = x;
poz[1] = 1;
for(int i = 2; i <= n; ++i)
{
fin >> x;
if(x >= d[lg])
{
d[++lg] = x;
poz[i] = lg;
}
else
poz[i] = cb(x);
a[i] = x;
}
stack<int> sol;
for(int i = lg, j = n; i > 0; --i)
{
while(poz[j] != i)
--j;
sol.push(j);
}
fout << sol.size() << '\n';
while(!sol.empty())
{
fout << sol.top() << ' ';
sol.pop();
}
return 0;
}