Cod sursa(job #2791435)

Utilizator Vlad_AnicaAnica-Popa Vlad-Ioan Vlad_Anica Data 30 octombrie 2021 14:57:43
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 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 reinit(int n, int m);

int ptr;
coord misc[700000];
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);
        }
        reinit(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))
        {
            misc[ptr++] = {c, l};
            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 reinit(int n, int m)
{
    for (int i = 0; i < ptr; i++)
        aib[misc[i].y][misc[i].x] = 0;
    ptr = 0;
}