Pagini recente » Cod sursa (job #2059139) | Clasament antrenament_oji2020 | Cod sursa (job #1059537) | Cod sursa (job #1370307) | Cod sursa (job #1741004)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
unsigned int a[100001];
unsigned int ind[100001];
unsigned int p[100001];
unsigned int best[100001];
unsigned int maxim,nr,pos,x,n;
void print(int i) {
if (p[i])
print(p[i]);
out<<a[i]<<" ";
}
unsigned int search(int x) {
unsigned int low=0,mid,high=nr;
while (low<=high) {
mid=low+(high-low)/2;
if (a[ind[mid]]<x && a[ind[mid+1]]>=x)
return mid;
else if (a[ind[mid+1]]<x)
low=mid+1;
else
high=mid-1;
}
return nr;
}
int main() {
in>>n;
for (unsigned int i=1;i<=n;i++) {
in>>a[i];
}
nr=1;
best[1]=ind[1]=1;
ind[0]=0;
for (unsigned int i=2;i<=n;i++) {
pos=search(a[i]);
p[i]=ind[pos];
best[i]=pos+1;
ind[pos+1]=i;
if (nr<pos+1)
nr=pos+1;
}
maxim=0; pos=0;
for (unsigned int i=1;i<=n;i++) {
if (maxim<best[i]) {
maxim=best[i];
pos=i;
}
}
out<<maxim<<"\n";
print(pos);
return 0;
}