Pagini recente » Cod sursa (job #1049597) | Cod sursa (job #1082639) | Istoria paginii runda/wr1/clasament | Cod sursa (job #2152375) | Cod sursa (job #2167641)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 100005;
int n;
int e[nmax], len[nmax], v[nmax], m[nmax], nr;
vector<int> sol;
int bin(int x)
{
int st = 0, dr = nr, mid;
for (mid = (st+dr)/2; st <= dr; mid = (st+dr)/2)
if(v[m[mid]] < x && v[m[mid+1]] >= x)
return mid;
else if (v[m[mid]] < x)
st = mid+1;
else dr = mid-1;
return nr;
}
int main()
{
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
fin >> n;
for (int i = 1; i <= n; ++i)
fin >> v[i];
for (int i = 1; i <= n; ++i){
int pos = bin(v[i]);
if(pos == nr)
++nr;
e[i] = m[pos]; //e retine care e indicele pe ce indice se duce termenul anterior din solutia cu lungime pos+1 curenta
m[pos+1] = i; //m retine indicele ultimului element din lista de lungime x
}
int k = m[nr];
for (int i = 1; i <= nr; ++i){
sol.push_back(v[k]);
k = e[k];
}
fout << nr << "\n";
//for (int i = sol.size()-1; i >= 0; --i)
//fout << sol[i] << " ";
for (int i = 1; i <= nr; ++i)
fout << v[m[i]] << " ";
return 0;
}