Cod sursa(job #2507222)

Utilizator T_george_TGeorge Teodorescu T_george_T Data 9 decembrie 2019 19:58:52
Problema Subsir crescator maximal Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int NMAX=100003;
int n,nr,v[NMAX],l[NMAX],best[NMAX],p[NMAX];
void afis(int i){
    if(p[i]>0) afis(p[i]);
        out<<i<<" ";
}
int caut(int x)
{
   int p, u, m;
   p = 0; u = nr; m = (p+u)/2;
   while (p <= u)
   {
      if (v[l[m]] < x &&  v[l[m+1]] >= x) return m;
      else if (v[l[m+1]] < x) {p = m + 1; m = (p + u)/2;}
      else {u = m - 1; m = (p + u)/2;}
   }
   return nr;
}
int main()
{
    in>>n;
    for(int i=1;i<=n;i++)
        in>>v[i];
    l[1]=best[1]=1,l[0]=0;
    nr=1;
    int poz;
    for(int i=2;i<=n;i++){
         poz=caut(v[i]);
      p[i]=l[poz];
      best[i]=poz+1;
      l[poz+1]=i;
      if (nr < poz + 1)   nr=poz+1;
        }
    int maxim=0;
    for(int i=1;i<=n;i++)
       if(maxim<best[i]){
        maxim=best[i];
        poz=i;
       }
       out<<maxim<<'\n';
    afis(poz);
    return 0;
}