Cod sursa(job #1418140)

Utilizator Liviu98Dinca Liviu Liviu98 Data 11 aprilie 2015 23:32:01
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMax 3505
using namespace std;
int AIB[NMax][NMax],N,T,Max;
struct Cutie
{
    int x,y,z;
}A[NMax];

int Bit(int x)
{
    return x&(-x);
}

void Curata(int x,int y)
{
    for(int i=x;i<=N;i+=Bit(i))
    for(int j=y;j<=N && AIB[i][j]!=0;j+=Bit(i))
    AIB[i][j]=0;
}

void Update(int x,int y,int valoare)
{
    for(int i=x;i<=N;i+=Bit(i))
    for(int j=y;j<=N && AIB[i][j]<valoare;j+=Bit(j))
    AIB[i][j]=valoare;
}

int Query(int x,int y)
{
    int Max=0;
    for(int i=x;i>0;i-=Bit(i))
    for(int j=y;j>0;j-=Bit(i))
        if(Max<AIB[i][j])
        Max=AIB[i][j];
    return Max;
}

bool comp(Cutie A,Cutie B)
{
    return (A.x < B.x || (A.x == B.x && A.y < B.y) || (A.x == B.x && A.y == B.y && A.z < B.z));
}

int main()
{
    freopen ("cutii.in","r",stdin);
    freopen ("cutii.out","w",stdout);
    int rez,Max=0;
    //g>>N>>T;
    scanf ("%d%d",&N,&T);
    for(int k=1;k<=T;k++)
    {
        for(int i=1;i<=N;i++)
            //g>>A[i].x>>A[i].y>>A[i].z;
        scanf ("%d%d%d",&A[i].x,&A[i].y,&A[i].z);
        sort(A+1,A+N+1,comp);

        Max=0;
        for(int i=1;i<=N;i++)
        {
            rez=Query(A[i].y-1,A[i].z-1)+1;
            if(Max<rez)
                Max=rez;

            Update(A[i].y,A[i].z,rez);
        }
            //cout<<Max<<endl;
            printf ("%d\n",Max);
            for(int i=1;i<=N;i++)
            Curata(A[i].y,A[i].z);
    }
}