Pagini recente » Cod sursa (job #2213914) | Cod sursa (job #264939) | Cod sursa (job #2083802) | Cod sursa (job #1780871) | Cod sursa (job #1052212)
//nu ii frumos sa te uiti pe sursele altora:))...hotule....nu o sti face singur?:))
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define MAX 100010
struct sebi{
int x, y;
};
inline bool cmp1(sebi a, sebi b){
if(a.x==b.x)
return a.y>b.y;
return a.x<b.x;
}
inline bool cmp2(sebi a, sebi b){
return a.y<b.y;
}
int AIB[MAX], n, v[MAX], rez[MAX], cpy[MAX];
sebi a[MAX];
int cauta(int p)
{
int m=0;
while(p)
{
if(AIB[p]>m)
m=AIB[p];
p-=(p&(-p));
}
return m;
}
void introdu(int p, int val)
{
while(p<=n)
{
AIB[p]=max(AIB[p], val);
p+=(p&(-p));
}
}
int main()
{
int i;
fin>>n;
for(i=1;i<=n;i++)
{
fin>>a[i].x;
cpy[i]=a[i].x;
a[i].y=i;
}
//inc normalizare
sort(a+1, a+n+1, cmp1);
for(i=1;i<=n;i++)
{
a[i].x=i;
}
sort(a+1, a+n+1, cmp2);
//sf normalizare
for(i=1;i<=n;i++)
{
v[i]=cauta(a[i].x)+1;
introdu(a[i].x, v[i]);
}
int maxi=1;
for(i=1;i<=n;i++)
{
if(v[i]>v[maxi])
maxi=i;
}
fout<<v[maxi]<<"\n";
int g=0;
rez[++g]=cpy[maxi];
for(i=maxi;i>=1;i--)
{
if(v[i]==v[maxi]-1 && a[i].x<a[maxi].x)
{
rez[++g]=cpy[i];
maxi=i;
}
}
for(i=g;i>=1;i--)
{
fout<<rez[i]<<" ";
}
}