Pagini recente » Cod sursa (job #3337098) | Borderou de evaluare (job #2242752) | Cod sursa (job #1647013) | Cod sursa (job #1491895) | Cod sursa (job #3355974)
///variant nlog n
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int NMAX = 1e5;
int n, v[NMAX+2];
int lung[NMAX+2], val_min[NMAX+2], cnt, sol[NMAX+2];
int caut_bin(int x_i)
{
int st = 1, dr = cnt, rez = st - 1;
while (st <= dr) {
int m = (st + dr) / 2;
if (val_min[m] < x_i) {
rez = m;
st = m + 1;
} else {
dr = m - 1;
}
}
return rez;
}
int main()
{
in>>n;
for (int i=1; i<=n; i++)
{
in>>v[i];
}
int pmax = 0;
for (int i=1; i<=n; i++)
{
int k = caut_bin(v[i]);
lung[i] = 1+k;
if (k== cnt )
{
cnt++;
val_min[cnt] = v[i];
}
else
{
val_min[k+1] = v[i];
}
if (lung[i] > lung[pmax]) {
pmax = i;
}
}
//out<<lung[pmax]<<endl;
int ant = v[pmax] + 1;
cnt=0;
for (int i=n; i>=1; i--)
{
if (lung[pmax] == lung[i] && ant > v[i])
{
cnt++;
sol[cnt] = v[i];
ant = v[i];
lung[pmax]--;
}
}
out<<cnt<<"\n";
for (int i=cnt; i>=1; i--)
{
out<<sol[i]<<" ";
}
return 0;
}