Cod sursa(job #1767765)

Utilizator ade_tomiEnache Adelina ade_tomi Data 29 septembrie 2016 18:36:37
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstring>
#define NMAX 3505
using namespace std;
int aib[NMAX][NMAX];
struct str
{
    int a, b, c;
};
str v[NMAX + 2];
int  lsb (int x)
{
    return x & (-x);
}
void update (int x, int y, int val)
{
    while (x <= NMAX)
    {
        int  y1 = y;
        while (y1 <= NMAX)
        {
            aib[x][y1] = max (aib[x][y1], val);
            y1 += lsb (y1);
        }
        x += lsb (x);
    }
}
int query (int x, int y)
{
    int sol = 0;
    while (x > 0)
    {
        int y1 = y;
        while (y1 > 0)
        {
            sol = max (sol, aib[x][y1]);
            y1 -= lsb (y1);
        }
        x-= lsb(x);
    }
    return sol;
}
bool cmp (str aa, str bb)
{
    return aa.a < bb.a;
}
int main ()
{
    int T,n;
    ifstream cin ("cutii.in");
    ofstream cout ("cutii.out");
    cin >> n >> T;
    while (T)
    {
        memset (aib, 0, sizeof(aib));
        T--;
        int sol = 0;
        for (int i = 1;i <= n; i++)
            cin >> v[i].a >> v[i].b >> v[i].c;
        sort (v + 1, v + 1 + n, cmp);
        int db = 1;
        for (int i = 1; i <= n; i++)
        {
           int q = query (v[i].b - 1, v[i].c - 1);
           sol = max (sol, q + 1);
           update (v[i].b, v[i].c, q + 1);
            
        }
        cout << sol << "\n";
    }
    return 0;
}