Pagini recente » Cod sursa (job #2439005) | Cod sursa (job #342830) | Cod sursa (job #1323718) | Cod sursa (job #1373262) | Cod sursa (job #2241943)
#include <iostream>
#include<fstream>
#define nmax 100000
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
int v[nmax], a[nmax], pred[nmax], n, l;
int BS(int start , int finish, int val) {
int s = start, f = finish, mij, pos = 0;
while(s <= f && pos == 0) {
mij = (s + f) /2 ;
if(v[a[mij]] < val && val < v[a[mij+1]])
pos = mij + 1;
else if(val > v[a[mij]])
s = mij + 1;
else f = mij - 1;
}
return pos;
}
void MIS() {
int i, pos;
l = 1;
a[1] = 1;
for(i = 2; i <= n; i++) {
if(v[i] > v[a[l]]) {
l++;
a[l] = i;
pred[i] = a[l-1];
}
else if(v[i] < v[a[1]])
a[1] = i;
else {
pos = BS(1, l, v[i]);
a[pos] = i;
pred[i] = a[pos-1];
}
}
}
void afis(int x) {
if(x) {
afis(pred[x]);
fout << v[x]<< " ";
}
}
int main()
{
fin >> n;
for(int i = 1; i <= n; i++)
fin >> v[i];
MIS();
fout << l << endl;
afis(a[l]);
fout << endl;
return 0;
}