Pagini recente » Cod sursa (job #471288) | Cod sursa (job #2134405) | Cod sursa (job #2971485) | Cod sursa (job #1119885) | Cod sursa (job #1737554)
#include <iostream>
#include <fstream>
#include <algorithm>
#define mkp make_pair
#define a first
#define b second
#define NMAX 100005
#define per pair<int,int>
using namespace std;
ifstream si("scmax.in");
ofstream so("scmax.out");
per aib[NMAX],v[NMAX];
int p[NMAX],r[NMAX],sol[NMAX];
int n;
void update(int poz,int x,int xpoz)
{
for(;poz<=n;poz+=poz&(-poz))
{
if(aib[poz].a<x)
{
aib[poz].a=x;
aib[poz].b=xpoz;
}
}
}
per querry(int poz)
{
int rez=0,rpoz;
for(;poz;poz-=poz&(-poz))
{
if(rez<aib[poz].a)
{
rez=aib[poz].a;
rpoz=aib[poz].b;
}
}
return mkp(rez,rpoz);
}
int main()
{
si>>n;
int i;
for(i=1;i<=n;++i)
{
si>>v[i].a;
v[i].b=-i;
r[i]=v[i].a;
}
sort(v+1,v+1+n);
per q;
int m=0,mpoz;
for(i=1;i<=n;i++)
{
q=querry(-v[i].b);
if(q.a+1>m)
{
m=q.a+1;
mpoz=-v[i].b;
}
p[-v[i].b]=q.b;
update(-v[i].b,q.a+1,-v[i].b);
}
so<<m<<'\n';
n=m;
for(m=0;n;n--,mpoz=p[mpoz])
{
sol[m]=r[mpoz];
++m;
}
while(m--)
{
so<<sol[m]<<' ';
}
so.close();
return 0;
}