Cod sursa(job #541220)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 24 februarie 2011 21:53:05
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <stdio.h>
#include <algorithm>

#define N 100005
int n;
int BIT[N];
int SirInitial[N];
int SirDistinct[N];
int SirSort[N];
int len[N];


using namespace std;

int binSrch(int val) {
    int st = 1;
    int dr = SirDistinct[0];
    while (st <= dr) {
        int mij = (st + dr) / 2;
        if (SirDistinct[mij] < val) st = mij  + 1;
         else
          if (SirDistinct[mij] > val) dr = mij - 1;
           else
             return mij;
    }
    return 0;
}
int Query(int p) {
    int max = BIT[p];
    while (p > 0) {
        if (max < BIT[p]) max = BIT[p];
        p -= (p & -p);
    }
    return max;
}
int Update(int p, int lval) {
    while (p <= SirDistinct[0]) {
        if (lval > BIT[p]) BIT[p] = lval;
        p += (p & -p);
    }
}
int printSol(int p, int u) {
    int x = p;
    if (u == -1) return 0;
    while (len[p] != u) p--;
    while (len[p] == u && SirDistinct[SirInitial[p]] >= SirDistinct[SirInitial[x]])
     p--;
    printSol(p, u-1);
    printf("%d ",SirDistinct[SirInitial[x]]);
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    scanf("%d",&n);
    for(int i = 1; i <= n; i++) {
     scanf("%d",&SirInitial[i]);
     SirSort[i] = SirInitial[i];
    }
    sort(SirSort + 1, SirSort + n + 1);
    for(int i = 0; i < n; i++)
     if (SirSort[i] != SirSort[i+1]) {
         SirDistinct[++SirDistinct[0]] = SirSort[i + 1];
     }
     for(int i = 1; i <= n; i++)
      SirInitial[i] = binSrch(SirInitial[i]);
     for(int i = 1; i <= n; i++)  {
         int best = 0;
         best = Query(SirInitial[i] - 1);
         len[i] = best + 1;
         Update(SirInitial[i],best + 1);
     }
     int max = 0;
     int poz = 0;
     for(int i = 1; i <= n; i++)  {
         if (max < len[i]) {
             max = len[i];
             poz = i;
         }
     }
     printf("%d\n",max);
     printSol(poz, max - 1);
     printf("\n");
     return 0;
}