Pagini recente » Cod sursa (job #1317876) | Cod sursa (job #2826635) | Cod sursa (job #3137602) | Cod sursa (job #343430) | Cod sursa (job #2436896)
// Matteo Verzotti - C++
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <ctime>
#include <map>
#include <chrono>
#include <cmath>
#define INF 0x3f3f3f3f
#define MAX(a,b) a>b ? a:b
#define MIN(a,b) a<b ? a:b
using namespace std;
/*mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
long long rand_seed() {
long long a = rng();
return a;
}*/
const int N = 1e5;
int v[N+5],poz[N+5],best[N+5];
vector <int> sol;
void cautbin(int st,int dr,int nr,int i)
{
int mid;
while(st <= dr)
{
mid = (st + dr) >> 1;
if(best[mid] >= nr)
dr = mid - 1;
else st = mid + 1;
}
best[st] = nr;
poz[i] = st;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n,i,nr,Max=0;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&nr);
cautbin(1,Max,nr,i);
Max=MAX(Max,poz[i]);
v[i] = nr;
}
printf("%d\n",Max);
for(i=n;i>=1;i--){
if(poz[i] == Max){
sol.push_back(v[i]);
Max--;
}
}
for(i=sol.size()-1;i>=0;i--)
printf("%d ",sol[i]);
printf("\n");
return 0;
}