Pagini recente » Cod sursa (job #2793859) | Cod sursa (job #2676353) | Cod sursa (job #849021) | Cod sursa (job #1798096) | Cod sursa (job #2221456)
#include <bits/stdc++.h>
#define NM 100002
using namespace std;
struct elem
{
int val, ind;
};
vector <int> vmax;
int n, v[NM], k[NM], mx, mxpos, v1[NM];
pair <int, int> aib[NM];
elem vn[NM];
bool fs(elem a, elem b)
{
return (a.val < b.val || (a.val == b.val && a.ind < b.ind));
}
int lsb(int val)
{
return val ^ (val & (val - 1));
}
void upd(int pos, int val, int vpos)
{
for(int i = pos; i <= n; i += lsb(i))
if(make_pair(val, vpos) > aib[i])
aib[i] = make_pair(val, vpos);
}
pair <int, int> qry(int pos)
{
pair <int, int> ans = make_pair(0, 0);
for(int i = pos - 1; i >= 1; i -= lsb(i))
if(aib[i] > ans)
ans = aib[i];
return ans;
}
int main()
{
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
fin >> n;
for(int i = 1; i <= n; i++)
{
fin >> vn[i].val;
v1[i] = vn[i].val;
vn[i].ind = i;
}
sort(vn + 1, vn + n + 1, fs);
for(int i = 1, nr = 0; i <= n; i++)
{
if(i == 1 || vn[i].val > vn[i - 1].val)
nr++;
v[vn[i].ind] = nr;
}
for(int i = 1; i <= n; i++)
{
pair <int, int> mx1 = qry(v[i]);
int dp = mx1.first + 1;
upd(v[i], dp, i);
k[i] = mx1.second;
if(dp > mx)
{
mx = dp;
mxpos = i;
}
}
fout << mx << "\n";
for(int i = mxpos; i > 0; i = k[i])
vmax.push_back(v1[i]);
for(int i = mx - 1; i >= 0; i--)
fout << vmax[i] << " ";
return 0;
}