Cod sursa(job #1518542)

Utilizator cristinalibotean177Libotean Cristina cristinalibotean177 Data 5 noiembrie 2015 22:44:43
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <cstdio>
#include <algorithm>

#define DIM 4096
#define x first
#define y second.first
#define z second.second
using namespace std;

pair <int, pair <int, int> > M[DIM];
int AIB[DIM][DIM], N, T, maxim, val;

inline int ub(int x)
{
    return (x&(-x));
}

int query (int p1, int p2)
{
    int nr = 0;
    for (int i = p1; i >= 1; i -= ub(i))
        for (int j = p2; j >= 1; j -= ub(j))
            nr = max (nr, AIB[i][j]);
    return nr;
}

void update (int p1, int p2, int nr)
{
    for (int i = p1; i <= N; i += ub(i))
        for (int j = p2; j <= N; j += ub(j))
            AIB[i][j] = max (AIB[i][j], nr);
    return;
}

void setVal (int p1, int p2, int nr)
{
    for (int i = p1; i <= N; i += ub(i))
        for (int j = p2; j <= N; j += ub(j))
            AIB[i][j] = 0;
    return;
}

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

    scanf ("%d %d", &N, &T);

    for (int t = 1; t <= T; t ++)
    {
        for (int i = 1; i <= N; i ++)
        {
            scanf ("%d", &M[i].x);
            scanf ("%d", &M[i].y);
            scanf ("%d", &M[i].z);
        }

        sort (M + 1, M + N + 1);

        maxim = 0;
        for (int i = 1; i <= N; i ++)
        {
            val = query(M[i].y - 1, M[i].z - 1);
            update (M[i].y, M[i].z, val + 1);
            maxim = max (maxim, val + 1);
        }

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

        for (int i = 1; i <= N; i ++)
            setVal (M[i].y, M[i].z, 0);
    }

    fclose (stdin );
    fclose (stdout);

    return 0;
}