Pagini recente » Cod sursa (job #450438) | Cod sursa (job #3267707) | Cod sursa (job #3259639) | Cod sursa (job #3200002) | Cod sursa (job #1000977)
#include <vector>
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
vector<int> V, best, ant;
int binary_search(int st, int dr, int poz) {
if (V[best[dr-1]] < V[poz])
return dr;
--dr;
int sol = 0;
while (st <= dr) {
int mij = (st + dr) / 2;
if (V[best[mij]] < V[poz]) {
sol = mij;
st = mij + 1;
}
else
dr = mij - 1;
}
return sol;
}
void print(int value) {
if(ant[value] > 0)
print(ant[value]);
fout<< V[value] << " ";
}
int main() {
int N; fin >> N;
V.resize(N);
ant.resize(N);
best.resize(N);
for(int i = 0; i < N; ++i)
fin >> V[i];
for(int i = 0; i < N; ++i)
ant[i] = -1;
int bestLg = 1;
for(int i = 1; i < N; ++i) {
int index = binary_search(0, bestLg, i);
if(index == bestLg) {
best[bestLg++] = i;
ant[i] = best[bestLg - 2];
}
else {
if(V[i] < V[best[bestLg - 1]])
best[bestLg - 1] = i;
if(bestLg - 2 >= 0)
ant[i] = best[bestLg - 2];
}
}
fout << bestLg << "\n";
print(best[bestLg - 1]);
return 0;
}