Pagini recente » Cod sursa (job #2904523) | Cod sursa (job #444373) | Cod sursa (job #2036433) | Cod sursa (job #2422921) | Cod sursa (job #873230)
Cod sursa(job #873230)
#include<fstream>
#include<algorithm>
using namespace std;
struct st
{
int x,y,z;
};
st a[100001],c[100001];
int b[100001],aib[100001],i,n,x,y;
ifstream f("scmax.in");
ofstream g("scmax.out");
void update(int k,int x)
{
int i;
for (i=k;i<=n;i=(i | (i-1))+1)
aib[i]=max(aib[i],x);
}
int query(int k)
{
int i,s=0;
for (i=k;i>0;i=i & (i-1))
s=max(s,aib[i]);
return s;
}
void afis()
{
int p;
while (i>1)
{
i--;
if ((b[i]==x) && (c[i].x<y))
{
p=c[i].x;
x--;
y=c[i].x;
afis();
g << p << ' ';
}
}
}
bool cmp(st a,st b)
{
return a.x<b.x;
}
int main()
{
f >> n;
for (i=1;i<=n;i++)
{
f >> a[i].x;
a[i].z=i;
}
sort(a+1,a+n+1,cmp);
x=0;
for (i=1;i<=n;i++)
{
if (a[i].x!=a[i-1].x)
x++;
a[i].y=x;
}
for (i=1;i<=n;i++)
c[a[i].z]=a[i];
for (i=1;i<=n;i++)
{
b[i]=query(c[i].y-1)+1;
update(c[i].y,b[i]);
}
x=0;
for (i=n;i>=1;i--)
if (b[i]>x)
{
x=b[i];
y=c[i].x;
}
y++;
i=n+1;
g << x << "\n";
afis();
return 0;
}