Pagini recente » Cod sursa (job #1392468) | Cod sursa (job #3294851) | Cod sursa (job #1812913) | Cod sursa (job #2677593) | Cod sursa (job #2850401)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in"); ofstream fout("scmax.out");
int n;
vector<int> v;
vector<int> d;
int k = 1;
void read() {
fin >> n;
v = vector<int>(n + 1), d = vector<int>(n + 1);
for(int i = 1; i <= n; i++)
fin >> v[i];
}
int query(int x) {
int p; //position of previous element that was lower than x
int st = 1, dr = k;
int mij;
while(st <= dr) {
mij = (st + dr) / 2;
if(d[mij] > x)
p = mij, dr = mij - 1;
else
st = mij + 1;
}
return p;
}
void build() {
int j;
d[1] = v[1];
for(int i = 2; i <= n; i++) {
if(v[i] == d[k]) //save some time
continue;
if(v[i] > d[k])
k++, d[k] = v[i];
else {
j = query(v[i]);
d[j] = v[i];
}
}
}
void print() {
fout << k << "\n";
for(int i = 1; i <= k; i++)
fout << d[i] << " ";
}
void fclose() {
fin.close(), fout.close();
}
int main() {
read();
build();
print();
fclose();
return 0;
}