Cod sursa(job #87675)

Utilizator andrei_infoMirestean Andrei andrei_info Data 28 septembrie 2007 17:30:26
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>

#define MAX 3600
#define max(a, b) ((a) > (b) ? (a) : (b))

using namespace std;

typedef struct {
                int x,y,z;
} pc;

bool operator< (const pc &p1, const pc &p2)
{
    return p1.z < p2.z;
};

int N,T, best[MAX];
pc p[MAX];
short int aib[MAX][MAX];

void update(int v, int x, int y, int k) //aduna v la elementul de pe pozitia x,y
{
        int i,j;
        for (i = x; i <=N; i+= ( i ^ (i-1)) & i) // i = 2 la puterea k ( k-nr zerourilor terminale din reprezentarea binara a lui i)
                for (j = y; j<=N; j+= (j ^ (j-1)) & j )
                {
                       aib[i][j]=max(aib[i][j],v);
                       if (k) aib[i][j] = 0;
                };
}

int query(int x, int y) // returneaza suma elementelor din matricea cu colturile [1,1] si [x,y]
{
        int sum = 0;
        for (int i = x; i>0; i-=( i ^ (i-1)) &i )
                for (int j = y; j>0; j-=( j ^ (j-1)) & j)
                        sum = max(aib[i][j],sum);
        return sum;
}



int main()
{
    freopen("cutii.in", "r", stdin);
    freopen("cutii.out", "w", stdout);

    scanf("%d%d\n", &N, &T);
    for (int t = 0; t<T; t++)
    {
            for (int i =0; i<N; i++)
                scanf("%d%d%d\n", &p[i].x, &p[i].y, &p[i].z);
            sort(p,p+N);

            //memset(best,1,sizeof(best));

            update(1,p[0].x, p[0].y, 0);
            int rez;

            for (int i = 1; i<N; i++)
            {
                rez = query(p[i].x, p[i].y) + 1;
                update(rez, p[i].x, p[i].y, 0);
            };
            rez = query(N,N);

            printf("%d\n", rez);

            for (int i = 0; i<N; i++)
                    update(0,p[i].x, p[i].y,1);


    }
    fclose(stdin); fclose(stdout);
    return 0;
};