Cod sursa(job #2646582)

Utilizator numecompletnume complet numecomplet Data 1 septembrie 2020 15:01:59
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>
#define NMAX 100009
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int v[4*NMAX];
vector<int> sol;
int n;
int a[NMAX];
int poz[NMAX];
int da[NMAX];
int val,pozval;
int getmax(int node, int st, int dr, int x, int y);
void update(int node, int st, int dr,int poz, int val);
int main()
{int i;
    fin>>n;
for(i=1;i<=n;i++)
    {fin>>a[i];
    poz[i]=a[i];
    }
 sort(a+1,a+n+1);
 for(i=1;i<=n;i++)
     poz[i]= lower_bound( a+1,a+n+1,poz[i])-a;


 for(i=1;i<=n;i++)
    {int maxim;
      if(poz[i]==1)
            maxim=0;
            else
            maxim=getmax(1,1,n,1,poz[i]-1);

      update( 1,1,n, poz[i], maxim+1);
      da[i]=maxim+1;
      if(maxim+1>val)
      {val=maxim+1;pozval=i;}
    }
  //for(i=1;i<=n;i++)
   //     fout<<da[i]<<" ";
  fout<<val<<'\n';
  for(i=pozval;i>=1;i--)
    {
     if( da[i]==val)
        {sol.push_back( a[ poz[i] ]   );val--;}
    }
 for(i=sol.size()-1;i>=0;i--)
          fout<<sol[i]<<" ";


    return 0;
}

int getmax(int node, int st, int dr, int x, int y)
{
  if(  x<=st && dr<=y)
        return v[node];
  int mj=(dr+st)/2;
  int max1=0;
  int max2=0;
  if( x<=mj)
      max1= getmax(2*node,st,mj,x,y);

  if( y>mj)
      max2= getmax(2*node+1,mj+1,dr,x,y);
 return max(max1,max2);
}
void update(int node, int st, int dr,int poz, int val)
{
  int mj=(dr+st)/2;
  if( st==dr)
        {v[node]=val;return;}
  if(poz<=mj)
      update(2*node,st,mj,poz,val);
     else
      update(2*node+1,mj+1,dr,poz,val);
   v[node]=max(v[2*node],v[2*node+1]);

}