Cod sursa(job #3280373)

Utilizator happyplaneDragos Miu-Baldu happyplane Data 26 februarie 2025 11:57:39
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <bits/stdc++.h>

using namespace std;

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

const int kMaxN=3505;
int fen_tree[kMaxN][kMaxN];
int nr_cutii,nr_teste,max_cuib=0;
void Update(int poz_x,int poz_y,int val)
{
    while(poz_x<kMaxN)
    {
        int poz_y_copy=poz_y;
        while(poz_y_copy<kMaxN)
        {
            fen_tree[poz_x][poz_y_copy]=max(fen_tree[poz_x][poz_y_copy],val);
            poz_y_copy+=poz_y_copy&-poz_y_copy;
        }
        poz_x+=poz_x&-poz_x;
    }
}
int Query(int poz_x,int poz_y)
{
    int cuib=0;
    while(poz_x>0)
    {
        int poz_y_copy=poz_y;
        while(poz_y_copy>0)
        {
            cuib=max(cuib,fen_tree[poz_x][poz_y_copy]);
            poz_y_copy-=poz_y_copy&-poz_y_copy;
        }
        poz_x-=poz_x&-poz_x;
    }
    return cuib;
}
struct Cutie
{
    int x,y,z;
    bool operator<(const Cutie b)
    {
        if(x==b.x)
        {
            if(y==b.y)
                return z>b.z;
            return y>b.y;
        }
        return x<b.x;
    }
}cutii[kMaxN];

int main()
{
    fin>>nr_cutii>>nr_teste;
    for(int t=0;t<nr_teste;++t)
    {
        max_cuib=0;
        memset(fen_tree,0,sizeof(fen_tree));
        for(int i=1;i<=nr_cutii;++i)
        {
            int x,y,z;
            fin>>x>>y>>z;
            cutii[i]={x,y,z};
        }
        sort(cutii+1,cutii+nr_cutii+1);
        for(int i=1;i<=nr_cutii;++i)
        {
            int cuib=Query(cutii[i].y,cutii[i].z)+1;
            max_cuib=max(max_cuib,cuib);
            Update(cutii[i].y,cutii[i].z,cuib);
        }
        fout<<max_cuib<<"\n";
    }
    return 0;
}