Cod sursa(job #3123371)

Utilizator unomMirel Costel unom Data 23 aprilie 2023 12:49:55
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.73 kb
/*#include <fstream>
#include <vector>

using namespace std;

ifstream in("scmax.in");
ofstream out("scmax.out");

struct multime
{
    int best = 0;
    vector<pair<int, int>> vec;
};

int n;
int ind = 0;
multime v[100005];
vector<int> ans;

int cb(int x)
{
    int st = 1;
    int dr = ind;
    int m;
    int poz = 0;

    while(st <= dr)
    {
        m = (st + dr) / 2;

        if(v[m].vec[v[m].best].first >= x)
        {
            poz = m;
            dr = m - 1;
        }
        else
        {
            st = m + 1;
        }
    }

    return poz;
}

int main()
{
    in>>n;

    int x, poz;

    in>>x;
    ind++;
    v[ind].vec.push_back({0, 0});
    v[ind].best++;
    v[ind].vec.push_back({x, 0});

    for(int i = 2; i<=n; i++)
    {
        in>>x;
        poz = cb(x);

        if(poz == 0)
        {
            ind++;
            v[ind].vec.push_back({0, 0});
            v[ind].best++;
            v[ind].vec.push_back({x, v[ind-1].best});
        }
        else
        {
            v[poz].best++;
            v[poz].vec.push_back({x, v[ind-1].best});
        }
    }


    out<<ind<<'\n';

    for(int i = 1; i<=ind; i++)
    {
        for(int j = 1; j<=v[i].best; j++)
        {
            out<<v[i].vec[j].first<<" "<<v[i].vec[j].second<<'\n';
        }
        out<<'\n';
    }

    pair<int, int> act = v[ind].vec[v[ind].best];

    for(int i = ind; i>=1; i--)
    {
        ans.push_back(act.first);

        if(i == 1)
        {
            break;
        }

        act = v[i-1].vec[act.second];
    }

    for(int i = ans.size()-1; i>=0; i--)
    {
        out<<ans[i]<<" ";
    }

    return 0;
}*/

#include <stdio.h>
int n, v[100003], best[100003], p[100003], maxim, k, L[100003], nr;

void afis(int i)
{
   if (p[i] > 0)  afis(p[i]);
   printf("%d ",v[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()
{
   freopen("scmax.in","r",stdin);
   freopen("scmax.out","w",stdout);
   int i, j, poz;
   nr = 1;

   scanf("%d",&n);
   for (i = 1; i <= n; i++) scanf("%d", v + i);
   best[1] = L[1] = 1; L[0] =  0;

   for (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;
   }
   maxim = 0; poz = 0;
   for (i = 1; i <= n; i++)
       if (maxim < best[i])
       {
          maxim = best[i]; poz = i;
       }
   printf("%d\n",maxim);
   afis(poz);
   return 0;
}