Pagini recente » Cod sursa (job #2051447) | Cod sursa (job #2674647) | Monitorul de evaluare | Cod sursa (job #1269089) | Cod sursa (job #1562733)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int MAX_N = 100000;
int n, norm;
pair < int, int > N[1 + MAX_N];
int Prev[1 + MAX_N];
int V[1 + MAX_N];
int T[1 + MAX_N];
pair < int, int > AIB[1 + MAX_N];
bool normSort(pair < int, int > A, pair < int, int > B) {
return get<0>(A) < get<0>(B);
}
int lsb(int x) {
return x & (-x);
}
void update(int i, pair < int, int > maxval) {
for(; i <= norm; i += lsb(i)) {
if(get<0>(AIB[i]) < get<0>(maxval)) {
AIB[i] = maxval;
}
}
}
pair < int, int > query(int i) {
pair < int, int > ans = make_pair(0, 0);
for(; i; i -= lsb(i)) {
if(get<0>(ans) < get<0>(AIB[i])) {
ans = AIB[i];
}
}
return ans;
}
void print(int ind) {
if(Prev[ind] > 0) print(Prev[ind]);
out << T[ind] << ' ';
}
int main() {
int n, i, j, bestval = 0, bestind = 0;
pair < int, int > qret;
in >> n;
for(i = 1; i <= n; i++) {
in >> V[i];
T[i] = V[i];
N[i] = make_pair(V[i], i);
}
sort(N+1, N+n+1, normSort);
for(i = 1; i <= n; i++) {
for(j = i; get<0>(N[j]) == get<0>(N[i]); j++) {
V[get<1>(N[j])] = norm + 1;
}
i = j - 1;
norm++;
}
for(i = 1; i <= n; i++) {
qret = query(V[i] - 1);
if(bestval < get<0>(qret) + 1) {
bestval = get<0>(qret) + 1;
bestind = i;
}
Prev[i] = get<1>(qret);
update(V[i], make_pair(get<0>(qret) + 1, i));
}
out << bestval << '\n';
print(bestind);
return 0;
}