Pagini recente » Cod sursa (job #2120884) | Cod sursa (job #2252272) | Cod sursa (job #2111107) | Cod sursa (job #1696800) | Cod sursa (job #3258707)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("scmax.in");
ofstream g ("scmax.out");
const int NMAX = 1e5;
const int INF = 2e9+1e4;
int n;
int v[NMAX+1], best[NMAX+1], prevv[NMAX+1];
vector<int> x;
int cb(int val){
int st = 1;
int dr = n;
int rez = 0;
while(st <= dr){
int mij = (st+dr)/2;
if(best[mij] != 2e9+1e4 and v[best[mij]] < val)
rez = mij, st = mij+1;
else dr = mij-1;
}
return rez;
}
int main()
{
f >> n;
for(int i=1; i<=n; i++)
f >> v[i];
fill(best, best+1+NMAX, 2e9+1e4);
for(int i=1; i<=n; i++){
int poz = cb(v[i]);
prevv[i] = best[poz];
best[poz+1] = i;
}
int last = 0;
int sz = 0;
for(int i=1; i<=n; i++)
if(best[i] != 2e9+1e4)
sz = i, last = best[i];
g << sz << endl;
while(last != INF){
x.push_back(v[last]);
last = prevv[last];
}
for(int i=x.size()-1; i>=0; i--)
g << x[i] << ' ';
return 0;
}