Cod sursa(job #1195025)

Utilizator apopeid15Apopei Daniel apopeid15 Data 5 iunie 2014 19:57:08
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <algorithm>

using namespace std;
struct cutie {
    int x,y,z;
}a[3505];
int n,t;
int arbore[3505][3505];
ofstream g("cutii.out");

bool compara(cutie a, cutie b)
{
    return a.x<b.x;
}

void adaugaInArbore(int& a, int& b, int valoare)
{
    for (int i=a; i<=n; i=(i|(i-1))+1)
        for (int j=b; j<=n; j=(j|(j-1))+1)
            if (valoare!=0)
            {
                if (arbore[i][j]<valoare)
                    arbore[i][j]=valoare;
            }
            else
            {
                    arbore[i][j]=valoare;
            }
}

int obtine(int&a, int& b)
{
    int s=0;
    for (int i=a-1; i>=1; i=i&(i-1))
        for (int j=b-1; j>=1; j=j&(j-1))
            if (s<arbore[i][j])
                s=arbore[i][j];
    return s;
}

void solve()
{
    int rezultat=0;
    for (int i=1; i<=n; i++)
    {
        int s1=obtine(a[i].y,a[i].z)+1;
        if (rezultat<s1)
            rezultat=s1;
        adaugaInArbore(a[i].y,a[i].z,s1);
    }
    for (int i=1; i<=n; i++)
        adaugaInArbore(a[i].y,a[i].z,0);
    g<<rezultat<<"\n";
}

int main()
{
    ifstream f("cutii.in");
    f>>n>>t;
    for (int k=1; k<=t; k++)
    {
        for (int i=1; i<=n; i++)
            f>>a[i].x>>a[i].y>>a[i].z;
        sort(a+1,a+n+1,compara);
        solve();
    }
}