Cod sursa(job #2328525)

Utilizator TavinciStefanescu Octavian Tavinci Data 25 ianuarie 2019 20:57:51
Problema Cutii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <bits/stdc++.h>
#define lim 3505

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

int t,n, rez;
int aib[lim][lim],test[lim][lim];
int x, y, z;
pair<int,int> c[lim];

int cutie(int actualX,int actualY)
{
    int cut=0;
    for(int i=actualX; i>0; i-=(i)&(-i))
        for(int j=actualY; j>0; j-=(j)&(-j))
        {
            if(test[i][j]!=t)aib[i][j]=0;
            cut=max(cut,aib[i][j]);
            test[i][j]=t;
        }
    return cut;
}

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


int main()
{
    fin>>n>>t;

    for(int j=1;j<=t;j++)
    {
        for(int i=1; i<=n; i++)
        {
            fin>>x>>y>>z;
            c[z].first=x;
            c[z].second=y;
        }
        rez=0;
        for(int i=1; i<=n; i++)
        {
            int actualX,actualY;
            actualX=c[i].first;
            actualY=c[i].second;
            aib[actualX][actualY]=cutie(actualX-1,actualY-1)+1;
            test[actualX][actualY]=t;
            update(actualX,actualY);
            rez=max(rez,aib[actualX][actualY]);
        }
        fout<<rez<<'\n';
        t--;
    }

    return 0;
}