Pagini recente » Cod sursa (job #2535811) | Cod sursa (job #1010854) | Cod sursa (job #1405553) | Cod sursa (job #389154) | Cod sursa (job #2777511)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, a[100005];
int cautare(int arr[], vector<int> v, int st, int dr, int x)
{
int mij;
while(dr - st > 1){
mij = st + (dr - st) / 2;
if (arr[v[mij]] >= x){
dr = mij;
}else{
st = mij;
}
}
return dr;
}
void Scmax(int N, int v[])
{
vector<int> tailInd(N, 0);
vector<int> prevInd(N, -1);
int len = 1;
for (int i=1;i<N;i++){
if (v[i] < v[tailInd[0]]){
tailInd[0] = i;
}else if (v[i] > v[tailInd[len - 1]]){
prevInd[i] = tailInd[len - 1];
tailInd[len ++] = i;
}else{
int pos = cautare(v, tailInd, -1, len - 1, v[i]);
prevInd[i] = tailInd[pos - 1];
tailInd[pos] = i;
}
}
int arr[N], l = 0;
fout << len << '\n';
for (int i=tailInd[len-1];i>=0;i = prevInd[i]){
arr[++l] = v[i];
}
for (int i=l;i>=1;i--){
fout << arr[i] << ' ';
}
fout << '\n';
}
int main() {
fin >> n;
for (int i=0;i<n;i++){
fin >> a[i];
}
Scmax(n, a);
return 0;
}