Cod sursa(job #2889855)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 13 aprilie 2022 15:41:51
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
//Ilie Dumitru
#include<cstdio>
typedef long long int ll;
const int NMAX=3505;
const ll MOD=1000000007;

FILE* f=fopen("cutii.in", "r"), *g=fopen("cutii.out", "w");

int AIB[NMAX][NMAX], N, x[NMAX], y[NMAX], iModif[NMAX*144], jModif[NMAX*144], modifCnt;

void reset()
{
    int i;
    for(i=0;i<modifCnt;++i)
        AIB[iModif[i]][jModif[i]]=0;
}

void change(int i, int j, int val)
{
    int k;
    for(;i<=N;i+=i&-i)
        for(k=j;AIB[i][k]<val && k<=N;k+=k&-k)
        {
            if(!AIB[i][k])
            {
                iModif[modifCnt]=i;
                jModif[modifCnt++]=k;
            }
            AIB[i][k]=val;
        }
}

int getMax(int i, int j)
{
    int max=0, k;
    for(;i;i^=i&-i)
        for(k=j;k;k^=k&-k)
            if(AIB[i][k]>max)
                max=AIB[i][k];
    return max;
}

void solve()
{
    int i, x, y, z, ans=0;
    for(i=0;i<N;++i)
    {
        fscanf(f, "%d%d%d", &x, &y, &z);
        ::x[--z]=x;
        ::y[z]=y;
    }
    for(i=0;i<N;++i)
    {
        x=getMax(::x[i], ::y[i])+1;
        if(x>ans)
            ans=x;
        change(::x[i], ::y[i], x);
    }
    reset();
    modifCnt=0;
    fprintf(g, "%d\n", ans);
}

int main()
{
    int T;
    fscanf(f, "%d%d", &N, &T);
    while(T--)
        solve();
    fclose(f);
    fclose(g);
    return 0;
}