Cod sursa(job #2956989)

Utilizator MrPuzzleDespa Fabian Stefan MrPuzzle Data 21 decembrie 2022 15:03:08
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<fstream>
#include<iostream>
#include<climits>
#include<algorithm>
#include<cstring>
#include<cmath>
#include <vector>
#include <queue>
#include <deque>

#define DIM 3500

using namespace std;

ifstream f("cutii.in");
ofstream g("cutii.out");

//ifstream f("in.in");
//ofstream g("out.out");

int n,t;
int aib[DIM+5][DIM+5];
struct box{
    int x;
    int y;
    int z;
}v[DIM+5];

int query(int poz1,int poz2){
    int maxi = 0;
    for(int i=poz1;i>=1;i-=(i&-i)){
        for(int j=poz2;j>=1;j-=(j&-j)){
            maxi = max(aib[i][j],maxi);
        }
    }
    return maxi;
}

void update(int poz1,int poz2,int x){
    for(int i=poz1;i<=n;i+=(i&-i)){
        for(int j=poz2;j<=n;j+=(j&-j)){
            aib[i][j] = max(aib[i][j],x);
        }
    }
}

void reset(int poz1,int poz2){
    for(int i=poz1;i<=n;i+=(i&-i)){
        for(int j=poz2;j<=n;j+=(j&-j)){
            aib[i][j] = 0;
        }
    }
}

bool cmp(box a,box b){
    return a.z < b.z;
}

void solve(){
    for(int i=1;i<=n;i++){
        f>>v[i].x>>v[i].y>>v[i].z;
    }
    sort(v+1,v+n+1,cmp);

    int sol = 1;
    for(int i=1;i<=n;i++){
        int maxi = query(v[i].x-1,v[i].y-1);
        update(v[i].x,v[i].y,maxi+1);
        if(sol < maxi+1){
            sol = maxi+1;
        }
    }

    g<<sol<<'\n';

    for(int i=1;i<=n;i++){
        reset(v[i].x,v[i].y);
    }
}

int main(){

    f>>n>>t;
    for(int i=1;i<=t;i++){
        solve();
    }

    f.close();
    g.close();
    return 0;
}