Pagini recente » Cod sursa (job #1632734) | Cod sursa (job #2770311) | Cod sursa (job #2678459) | Cod sursa (job #3004425) | Cod sursa (job #1202059)
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("scmax.in");
ofstream o("scmax.out");
int n,a[100100],b[210000],pre[100010],best[100010],last,lb=1,sol=1;
/*void sortq(int l,int r){
int m = c[(l+r)/2], i=l, j=r;
do{
while(c[i]<m)i++;
while(c[j]>m)j--;
if(i<=j){
swap(d[i],d[j]);
swap(c[i],c[j]);
i++;
j--;
}
}while(i<=j);
if(i<r)sortq(i,r);
if(j>l)sortq(l,j);
}*/
int binary(int l,int r, int x){
if(l==r)return l;
int m = (l+r)/2;
if(b[m+1]>x)return binary(m+1,r,x);
else return binary(l,m,x);
}
int main(){
f>>n;
for(int i=1;i<=n;i++)f>>a[i];
// sortq(1,n);
best[n]=1;
b[1] = a[n];
b[0] = 0;
for(int i=n-1;i;i--){
int maxim = binary(0,lb,a[i])+1;
best[i]=maxim;
b[maxim] = max(b[maxim],a[i]);
if(best[i]>sol){
sol = maxim;
last = i;
lb++;
}
}
o<<sol<<"\n"<<a[last]<<" ";
int val = a[last];sol--;
for(int i=last+1;i<=n;i++)
if(a[i]>val && best[i]==sol){
o<<a[i]<<" ";
sol--;
val = a[i];
}
}