Cod sursa(job #2549064)

Utilizator AlexBolfaAlex Bolfa AlexBolfa Data 17 februarie 2020 11:42:17
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <bits/stdc++.h>
#define NMAX (int)(3504)
#define pb emplace_back
#define ft first
#define sd second
using namespace std;
ifstream fin("cutii.in");
ofstream fout("cutii.out");
typedef pair <int, int> pairINT;
typedef long long ll;
class FenwickTree2D{
    public:
        int n;
        void upd(int x, int y,int val){
            for(;x<=n;x+=lsb(x))
                for(int y1=y;y1<=n;y1+=lsb(y1))
                    fen[x][y1]=max(fen[x][y1], val);
        }
        int qry(int x, int y){
            int sol=0;
            for(;x;x-=lsb(x))
                for(int y1=y;y1;y1-=lsb(y1))
                    sol=max(sol, fen[x][y1]);
            return sol;
        }
        void del(int x, int y){
            for(;x<=n;x+=lsb(x))
                for(int y1=y;y1<=n;y1+=lsb(y1))
                    fen[x][y1]=0;
        }
    private:
        int fen[NMAX][NMAX];//y, z
        int lsb(int &x){ return x&(-x); }
};

int n,t;
pair <int, pairINT> v[NMAX];
FenwickTree2D bit;

int main(){
    fin>>n>>t;
    bit.n=n;
    for(int sol=0;t;--t,sol=0){
        for(int i=0;i<n;++i)
            fin>>v[i].ft>>v[i].sd.ft>>v[i].sd.sd;
        sort(v, v+n);

        for(int i=0,val;i<n;++i){
            val=bit.qry(v[i].sd.ft-1, v[i].sd.sd-1) + 1;
            sol=max(sol, val);
            bit.upd(v[i].sd.ft, v[i].sd.sd, val);
        }
        for(int i=0;i<n;++i)
            bit.del(v[i].sd.ft, v[i].sd.sd);

        fout<<sol<<'\n';
    }
    return 0;
}