Pagini recente » Cod sursa (job #389907) | Cod sursa (job #275425) | Cod sursa (job #1744197) | Cod sursa (job #794556) | Cod sursa (job #793949)
Cod sursa(job #793949)
#include "fstream"
#include "algorithm"
#define N 100010
#define zeros(x) (x & -x)
using namespace std;
int aib[N], x[N], s[N], prec[N], n, m, cant[N], imax;
ifstream f("scmax.in");
ofstream g("scmax.out");
void prepareData();
int query(int i);
void update(int i, int c);
void writeData(int i);
int main()
{
prepareData();
for(int i=1; i<=n; i++)
{
prec[i] = query(x[i]-1);
cant[i] = cant[prec[i]] + 1;
if(cant[i] > cant[imax])
{
imax = i;
}
update(x[i], i);
}
writeData(imax);
}
void prepareData()
{
f >> n;
for(int i = 1; i <= n; i++)
{
f >> x[i];
s[i] = x[i];
}
sort(s + 1, s + n + 1);
m = 1;
for(int i = 1; i <= n; i++)
{
if( s[i] != s[m-1] )
s[m++] = s[i];
}
for(int i = 1; i <= n; i++)
{
x[i] = lower_bound(s + 1, s + m, x[i]) - s;
}
f.close();
}
int query(int i)
{
int imx = 0;
for(; i; i-=zeros(i))
if(cant[aib[i]] > cant[imx])
{
imx = aib[i];
}
return imx;
}
void update(int i, int c)
{
for(; i<=n; i += zeros(i))
if(cant[c] > cant[aib[i]])
aib[i] = c;
}
void writeData(int i)
{
if(i)
{
writeData(prec[i]);
g << s[x[i]] << ' ';
}
else
{
g << cant[imax] << '\n';
}
}