Cod sursa(job #1463876)

Utilizator rangerChihai Mihai ranger Data 21 iulie 2015 18:24:46
Problema Subsir crescator maximal Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
# include <bits/stdc++.h>
using namespace std;


ifstream fi("scmax.in");
ofstream fo("scmax.out");
const int N = 100005;
int n;

int t[4*N];
int dp[N];
int res;

struct cop{
 int val, id;
} b[N];
bool cmp(cop a, cop b)  { return a.val < b.val; }
int a[N], rm[N];

void update(int nod,int l, int r, int pos, int val)
{
    if (l == r) {
        t[nod] = max(t[nod], val);
        return;
    }
    int m = (l+r)/2;
    if (pos <= m) update(2*nod, l,m,pos,val);
    else update(2*nod+1,m+1,r,pos,val);
    t[nod] = max(t[nod*2], t[nod*2+1]);
}
int get_max(int nod, int l, int r, int a, int b)
{
    if (a==l && r==b) return t[nod];
    int m=(l+r)/2;
    if (b<=m) return get_max(2*nod,l,m,a,b);
    if (a>m) return get_max(2*nod+1,m+1,r,a,b);
    return max(get_max(2*nod,l,m,a,m), get_max(2*nod+1,m+1,r,m+1,b));
}

int main()
{
    fi>>n;
    for (int i=1;i<=n;i++) fi>>a[i],  b[i].val = a[i], b[i].id = i;
    sort(b+1,b+n+1, cmp);
    int k = 0;
    for (int i=1;i<=n;i++)
    {
        if (b[i].val != b[i-1].val) k++;
        a[b[i].id] = k;
        rm[k] = b[i].val;
    }



    for (int i=1;i<=n;i++)
    {
        dp[i] = get_max(1,0,n,0,a[i]-1) + 1;
        update(1,0,n,a[i],dp[i]);
        res = max(res, dp[i]);

    }

    fo << res;
    return 0;
}