Cod sursa(job #2359100)

Utilizator dacianouaPapadia Mortala dacianoua Data 28 februarie 2019 17:10:24
Problema Subsir crescator maximal Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
#include <iostream>
#include <stdio.h>
#include <vector>
#define nmax 100000
#define dim 10000
using namespace std;
int poz,n;
pair<int,int> v[nmax+5];
int arb[4*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=v[(left+right)>>1];
    while(i<=j)
    {
        while(compare(v[i],mij))
            i++;
        while(compare(mij,v[j]))
            j--;
        if(i<=j)
        {
            temp=v[i];
            v[i]=v[j];
            v[j]=temp;
            i++;
            j--;
        }
    }
    if(left<j)
        quicksort(left,j);
    if(right>i)
        quicksort(i,right);
}
void read(int &nr)
{
    nr=0;
    while(buff[poz]<'0' || buff[poz]>'9')
        if(++poz==dim)
        fread(buff,1,dim,fin),poz=0;
    while(buff[poz]>='0' && buff[poz]<='9')
    {
        nr=nr*10+buff[poz]-'0';
        if(++poz==dim)
            fread(buff,1,dim,fin),poz=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;
    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(v[i].first),v[i].second=i;
    quicksort(1,n);
    for(int i=1;i<=n;i++)
        update(v[i].second,query(1,v[i].second,1,1,n)+1,1,1,n);
    fprintf(fout,"%d",arb[1]);
    return 0;
}