Cod sursa(job #1333708)

Utilizator gapdanPopescu George gapdan Data 3 februarie 2015 15:07:19
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<cstdio>
#include<vector>
#define NMAX 5000
#define LSB(x) (x&(-x))
#define max(a,b) (a>b?a:b)
using namespace std;
int i,j,n,k,Max,sol,x,y,z,t;
int AIB[3505][3505];
struct cub
{
    int l,r;
};
cub v[3505];
cub mp(int a,int b)
{
  cub X;X.l=a;X.r=b;
  return X;
}
int query(int st,int dr)
{
    int i,j;
    for (i=st;i>0;i-=(i&(-i)))
        for (j=dr;j>0;j-=(j&(-j)))
            Max=max(Max,AIB[i][j]);
    return Max;
}
void update(int st,int dr,int val)
{
    int i,j;
    for (i=st;i<=n;i+=LSB(i))
        for (j=dr;j<=n;j+=LSB(j))
            AIB[i][j]=max(val,AIB[i][j]);
}
void init()
{
    for (i=1;i<=n;++i)
        for (j=v[i].l;j<=n;j+=LSB(j))
            for (k=v[i].r;k<=n;k+=LSB(k)) AIB[j][k]=0;
}
int main()
{
    freopen("cutii.in","r",stdin);
    freopen("cutii.out","w",stdout);
    scanf("%d%d",&n,&t);
    while(t>0)
    {
        --t;
        for (i=1;i<=n;++i)
        {
            scanf("%d%d%d",&x,&y,&z);
            v[z]=mp(x,y);
        }
        sol=0;
        for (i=1;i<=n;++i)
        {
            Max=0;
            Max=query(v[i].l-1,v[i].r-1);
            update(v[i].l,v[i].r,Max+1);
            if (Max+1>sol) sol=Max+1;
        }
        printf("%d\n",sol);
        init();
    }
    return 0;
}