Cod sursa(job #2791412)

Utilizator Vlad_AnicaAnica-Popa Vlad-Ioan Vlad_Anica Data 30 octombrie 2021 14:31:07
Problema Cutii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <stdio.h>
#include <vector>

using namespace std;
const int NMAX = 3500;

struct coord
{
    int x, y;
};

int aib[NMAX + 1][NMAX + 1];
void update(int l, int c, int val, int n, int m);
int query(int l, int c, int n, int m);
void init(int n, int m);


vector<coord> lists[NMAX + 1];
int maxx[NMAX];

int main()
{
    int n, t, i, j, x, y, z, maxl, maxc, maxlen, vlen;
    FILE *fin = fopen("cutii.in", "r");
    FILE *fout = fopen("cutii.out", "w");
    fscanf(fin, "%d%d", &n, &t);

    for (int k = 0; k < t; k++)
    {
        maxlen = maxc = maxl = 0;
        for (j = 0; j < n; j++)
        {
            fscanf(fin, "%d%d%d", &x, &y, &z);
            lists[z].push_back({x, y});
            maxc = max(maxc, x);
            maxl = max(maxl, y);
        }
       // init(maxl, maxc);
        for (z = 1; z <= n; z++)
        {
            vlen = lists[z].size();
            for (i = 0; i < vlen; i++)
            {
                maxx[i] = query(lists[z][i].y, lists[z][i].x, maxl, maxc);
                if (maxx[i] > maxlen)
                    maxlen = maxx[i];
            }
            for (i = 0; i < vlen; i++)
                update(lists[z][i].y, lists[z][i].x, maxx[i] + 1, maxl, maxc);
            lists[z].clear();
        }

        fprintf(fout, "%d\n", maxlen + 1);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}

void update(int l, int c, int val, int n, int m)
{
    int cpc = c, cpl = l;
    for (l = cpl; l <= n; l += (l & -l))
        for (c = cpc; c <= m; c += (c & -c))
            aib[l][c] = max(aib[l][c], val);
}
int query(int l, int c, int n, int m)
{
    int maxx = 0;
    int cpl = l, cpc = c;
    for (l = cpl; l > 0; l -= (l & -l))
        for (c = cpc; c > 0; c -= (c & -c))
            maxx = max(maxx, aib[l][c]);
    return maxx;
}
void init(int n, int m)
{
    for (int l = 1; l <= n; l++)
        for (int c = 1; c <= m; c++)
            aib[l][c] = 0;
}