Pagini recente » Cod sursa (job #1511251) | Istoria paginii runda/abcdfegh | nume | Autentificare | Cod sursa (job #2016027)
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>
using namespace std;
struct miau{int val,poz;} v[100005];
int n,i,j,d[100005],maxi,aint[400005],val,poz,a,b,sol[100005],m;
ifstream f("scmax.in");
ofstream g("scmax.out");
bool cmp(miau a, miau b)
{
return a.val<b.val ||(a.val==b.val && a.poz>b.poz);
}
void update(int nod, int l, int r)
{
int mid=(l+r)/2;
if(l==r) aint[nod]=d[i];
else
{
if(poz<=mid) update(2*nod,l,mid);
else update(2*nod+1,mid+1,r);
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
}
void query(int nod, int l, int r)
{
int mid=(l+r)/2;
if(a<=l && b>=r) val=max(val,aint[nod]);
else if(l!=r)
{
if(a<=mid) query(2*nod,l,mid);
if(b>mid) query(2*nod+1,mid+1,r);
}
}
int main()
{
f>>n;
for(i=1;i<=n;i++)
{
f>>v[i].val;
v[i].poz=i;
}
sort(v+1,v+n+1,cmp);
for(i=1;i<=n;i++)
{
val=0; a=1; b=v[i].poz-1;
query(1,1,n);
d[i]=val+1;
poz=v[i].poz;
update(1,1,n);
if(d[i]>maxi) maxi=d[i];
}
g<<maxi<<'\n';
val=2000000001;
for(i=n;i>=1;i--)
{
if(d[i]==maxi && v[i].val<val)
{
sol[++m]=v[i].val;
maxi--;
val=v[i].val;
}
}
for(i=m;i>=1;i--) g<<sol[i]<<' ';
return 0;
}