Cod sursa(job #1377617)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 5 martie 2015 23:05:41
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include <algorithm>
#define ub(i) i&(-i)
#define nmax 3510
using namespace std;
ifstream f("cutii.in");
ofstream g("cutii.out");
short aib[nmax][nmax];
int n,din[nmax];
struct cutie{int x;int y;int z;};
cutie v[nmax];



bool compare(const cutie &a,const cutie &b)
{
    return a.x<b.x;
}
void update(int l,int c,int x)
{
    int i,j;
    for (i=l;i<=n;i+=ub(i))
        for (j=c;j<=n;j+=ub(j))
            aib[i][j]=max(aib[i][j],short(x));
}
void updatezero(int l,int c)
{
    int i,j;
    for (i=l;i<=n;i+=ub(i))
        for (j=c;j<=n;j+=ub(j))
            aib[i][j]=0;
}
int query(int l, int c)
{
    int i,j,sol=0;
    for (i=l;i>=1;i-=ub(i))
        for (j=c;j>=1;j-=ub(j))
            sol=max(sol,int(aib[i][j]));
    return sol;
}
void solve()
{
    int i,j,sol=0;
    for (i=1;i<=n;i++)
        f>>v[i].x>>v[i].y>>v[i].z;
    sort(v+1,v+n+1,compare);
    for (i=1;i<=n;i++) {
        din[i]=query(v[i].y-1,v[i].z-1)+1;
        update(v[i].y,v[i].z,din[i]);
    }
    for (i=1;i<=n;i++) {
        updatezero(v[i].y,v[i].z);
        sol=max(sol,din[i]);
    }
    g<<sol<<'\n';
}

int main()
{
    f>>n;
    int t;
    for (f>>t;t;t--)
        solve();

    return 0;
}