Cod sursa(job #1059125)

Utilizator alexpascadiAlexandru Pascadi alexpascadi Data 16 decembrie 2013 11:11:58
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>

using namespace std;

const int N=3501;
int t[N],r[N][N],n,T,v1[N],v2[N];

int max(int a, int b)
{
    if(a>b) return a;
    return b;
}

int query(int i, int j)
{
    int dmax=-1,p=i,q;
    while(p>0)
    {
        q=j;
        while(q>0)
        {
            if(r[p][q]>dmax) {dmax=r[p][q];}
            q-=q&-q;
        }
        p-=p&-p;
    }
    return dmax;
}

void update(int i, int j)
{
    int p=i,q;
    r[i][j]=query(i-1,j-1)+1;
    while(p<=n)
    {
        q=j;
        while(q<=n)
        {
            r[p][q]=max(r[p][q],r[i][j]);
            q+=q&-q;
        }
        p+=p&-p;
    }
}

int main()
{
    FILE *in,*out;
    in=fopen("cutii.in","r");
    out=fopen("cutii.out","w");
    int k,i,j,x,y,z,max;
    fscanf(in,"%d%d",&n,&T);
    for(k=1;k<=T;k++)
    {
        for(i=1;i<=n;i++)
        {
            fscanf(in,"%d%d%d",&x,&y,&z);
            v1[x]=y;
            v2[x]=z;
        }
        max=-1;
        for(i=1;i<=n;i++)
        {
            r[i][i]=query(v1[i]-1,v2[i]-1)+1;
            if(r[i][i]>max) max=r[i][i];
            update(v1[i],v2[i]);
        }
        fprintf(out,"%d\n",max+1);
    }

    return 0;
}