Cod sursa(job #2258015)

Utilizator lupulescu2001Lupulescu Vlad lupulescu2001 Data 10 octombrie 2018 18:58:29
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<fstream>
#include<algorithm>

using namespace std;

ifstream fin("cutii.in");
ofstream fout("cutii.out");

const int NMax=3505;
int N,T,AIB[NMax][NMax];
struct Cutii{
    int X,Y,Z;
} C[NMax];

bool Comp(Cutii A,Cutii B){
    return A.X<B.X;
}

int Next(int A){
    return A&(-A);
}

int Query(int A,int B){
    int Ans=0;
    for(int i=A;i>=1;i=i-Next(i))
        for(int j=B;j>=1;j=j-Next(j))
            Ans=max(Ans,AIB[i][j]);
    return Ans;
}

void Update(int A,int B,int Val){
    for(int i=A;i<=N;i=i+Next(i))
        for(int j=B;j<=N;j=j+Next(j))
            AIB[i][j]=max(AIB[i][j],Val);
}

void Begin(int A,int B){
    for(int i=A;i<=N;i=i+Next(i))
        for(int j=B;j<=N;j=j+Next(j))
            AIB[i][j]=0;
}

int main(){
    fin>>N>>T;
    for(int p=1;p<=T;p++){
        for(int i=1;i<=N;i++)
            fin>>C[i].X>>C[i].Y>>C[i].Z;
        sort(C+1,C+1+N,Comp);
        for(int i=1;i<=N;i++){
            int Val=1+Query(C[i].Y-1,C[i].Z-1);
            Update(C[i].Y,C[i].Z,Val);
        }
        fout<<Query(N,N)<<'\n';
        for(int i=1;i<=N;i++)
            Begin(C[i].Y,C[i].Z);
    }
    return 0;
}