Cod sursa(job #2323514)

Utilizator AlexTheDagonBogdan Tudor AlexTheDagon Data 19 ianuarie 2019 11:51:42
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb

#include <bits/stdc++.h>
#define x first
#define y second
#define piii pair<pair<int,int> ,int>
#define pii pair<int,int>


using namespace std;
ifstream in("cutii.in");
ofstream out("cutii.out");
const int NM = 3505;
int t,n;
int aib[NM][NM];
char test[NM][NM];

int find_max(int i,int j)
{
    int maxx=0;
    for(int pi=i; pi>0; pi-=(pi)&(-pi))
        for(int pj=j; pj>0; pj-=(pj)&(-pj))
        {
            if(test[pi][pj]!=t)aib[pi][pj]=0;
            maxx=max(maxx,aib[pi][pj]);
            test[pi][pj]=t;
        }
    return maxx;
}

void update(int i,int j)
{
    for(int pi=i; pi<=n; pi+=(pi)&(-pi))
        for(int pj=j; pj<=n; pj+=(pj)&(-pj))
        {
            if(test[pi][pj]!=t)aib[pi][pj]=0;
            aib[pi][pj]=max(aib[pi][pj],aib[i][j]);
            test[pi][pj]=t;
        }
}

piii a[NM];
pii c[NM];
int main()
{
    in>>n>>t;

    while(t--)
    {
        for(int i=1; i<=n; ++i)in>>a[i].x.x>>a[i].x.y>>a[i].y;
        for(int i=1;i<=n;++i)
        {
            c[a[i].y].x=a[i].x.x;
            c[a[i].y].y=a[i].x.y;
        }
        int sol=0;
        for(int i=1; i<=n; ++i)
        {

            int px,py;
            px=c[i].x;
            py=c[i].y;

            aib[px][py]=find_max(px-1,py-1)+1;
            test[px][py]=t;
            update(px,py);
            sol=max(sol,aib[px][py]);

        }
        out<<sol<<'\n';
    }

    return 0;
}