Cod sursa(job #2360711)

Utilizator dacianouaPapadia Mortala dacianoua Data 2 martie 2019 09:02:36
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.4 kb
#include <stdio.h>
#include <vector>
#define nmax 100000
#define dim 10000
using namespace std;
int pos,n,here,tmp,q;
pair<int,int> v1[nmax+5],v2[nmax+5];
vector<int> ans;
int arb[4*nmax+5],bst[nmax+5];
char buff[dim+5];
FILE *fin=fopen("scmax.in","r");
FILE *fout=fopen("scmax.out","w");
int compare(pair<int,int> p1,pair<int,int> p2)
{
    if(p1.first==p2.first)
        return p1.second>p2.second;
    return p1.first<p2.first;
}
int maxv(int x,int y)
{
    return x>y?x:y;
}
void quicksort(int left,int right)
{
    int i=left,j=right;
    pair<int,int> temp,mij=v1[(left+right)>>1];
    while(i<=j)
    {
        while(compare(v1[i],mij))
            i++;
        while(compare(mij,v1[j]))
            j--;
        if(i<=j)
        {
            temp=v1[i];
            v1[i]=v1[j];
            v1[j]=temp;
            i++;
            j--;
        }
    }
    if(left<j)
        quicksort(left,j);
    if(right>i)
        quicksort(i,right);
}
void read(int &nr)
{
    nr=0;
    while(buff[pos]<'0' || buff[pos]>'9')
        if(++pos==dim)
        fread(buff,1,dim,fin),pos=0;
    while(buff[pos]>='0' && buff[pos]<='9')
    {
        nr=nr*10+buff[pos]-'0';
        if(++pos==dim)
            fread(buff,1,dim,fin),pos=0;
    }
}
void update(int poz,int val,int nod,int st,int dr)
{
    if(st==dr)
    {
        arb[nod]=val;
        return;
    }
    int mid=(st+dr)>>1,tmp;
    if(poz>mid)
        update(poz,val,(nod<<1)+1,mid+1,dr);
    else
        update(poz,val,nod<<1,st,mid);
    arb[nod]=maxv(arb[nod<<1],arb[(nod<<1)+1]);
}
int query(int l,int r, int nod,int st,int dr)
{
    if(st>=l && dr<=r)
        return arb[nod];
    int mid=(st+dr)>>1,sol=-1;
    if(mid>=l)
        sol=maxv(sol,query(l,r,nod<<1,st,mid));
    if(mid<r)
        sol=maxv(sol,query(l,r,(nod<<1)+1,mid+1,dr));
    return sol;
}
int main()
{
    read(n);
    for(int i=1;i<=n;i++)
        read(v1[i].first),v1[i].second=i,v2[i]=v1[i];
    quicksort(1,n);
    for(int i=1;i<=n;i++)
        q=query(1,v1[i].second,1,1,n)+1,update(v1[i].second,q,1,1,n),bst[v1[i].second]=q;
    fprintf(fout,"%d\n",arb[1]);
    for(int i=1;i<=n;i++)
        if(bst[i]==arb[1])
        {here=i;break;}
    for(int i=here;i>0;i--)
        if(arb[1]==bst[i])
        ans.push_back(v2[i].first),--arb[1];
    for(int i=ans.size()-1;i>=0;i--)
        fprintf(fout,"%d ",ans[i]);
    return 0;
}