Cod sursa(job #2942167)

Utilizator oskar01oskar the boss oskar01 Data 19 noiembrie 2022 11:41:46
Problema Cutii Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream cin("cutii.in");
ofstream cout("cutii.out");

#define DEBUG 0

class BIT {
private:
    int n;
    vector<vector<int>> ma;
public:
    void resize(int n) {
        ma.clear();
        this->n=n;
        ma.resize(n+1,vector<int>(n+1,0));
    }
    void update(int x,int y,int val) {
        for(int i=x;i<=n;i+=(i & (~i+1))) {
            for(int j=y;j<=n;j+=(j & (~j+1))) {
                ma[i][j]=max(ma[i][j],val);
            }
        }
    }
    int query(int x,int y) {
        int res=0;
        for(int i=x;i>0;i-=(i & (~i+1))) {
            for(int j=y;j>0;j-=(j & (~j+1))) {
                res=max(res,ma[i][j]);
            }
        }
        return res;
    }
};

struct Info {
    int x;
    int y;
    int z;
    bool operator<(Info a2) const {
        return z<a2.z;
    }
};

int n,t;
vector<Info> v;
vector<int> dp;
BIT bit;

void read(){
    cin>>n>>t;
}

void solve() {
    while(t--) {
        v.clear();
        dp.clear();
        bit.resize(n+1);
        v.resize(n+1);
        dp.resize(n+1);
        for(int i=1;i<=n;i++) {
            cin>>v[i].x>>v[i].y>>v[i].z;
        }
        sort(v.begin()+1,v.end());
        for(int i=1;i<=n;i++) {
            dp[i]=bit.query(v[i].x,v[i].y)+1;
            bit.update(v[i].x,v[i].y,dp[i]);
        }
        int res=0;
        for(int i=1;i<=n;i++) {
            if(DEBUG==1) {
                cout<<dp[i]<<" ";
            }
            res=max(res,dp[i]);
        }
        if(DEBUG==1) {
            cout<<"\n";
        }
        cout<<res<<"\n";
    }
}

int main() {

    read();
    solve();
    return 0;
}