Pagini recente » Cod sursa (job #450531) | Cod sursa (job #2918890) | Cod sursa (job #657879) | Cod sursa (job #1834396) | Cod sursa (job #2850431)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in"); ofstream fout("scmax.out");
int n;
vector<int> v;
vector<int> d;
vector<int> P;
int k = 1;
void read() {
fin >> n;
v = vector<int>(n + 1), d = vector<int>(n + 1), P = vector<int>(n + 1);
for(int i = 1; i <= n; i++)
fin >> v[i];
}
int query(int x) {
int p = 0; //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])
k++, d[k] = v[i], P[i] = k;
else {
j = query(v[i]);
d[j] = v[i];
P[i] = j;
}
}
}
void printv(int i, int j) {
if(i == 0)
return;
while(P[j] != i)
j--;
i--, printv(i, j);
fout << v[j] << " ";
}
void print() {
fout << k << "\n";
printv(k, n);
}
void fclose() {
fin.close(), fout.close();
}
int main() {
read();
build();
print();
fclose();
return 0;
}