Cod sursa(job #1435526)

Utilizator GinguIonutGinguIonut GinguIonut Data 13 mai 2015 18:19:13
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <fstream>
#include <string.h>
#include <algorithm>
#define dim 3501
using namespace std;
ifstream fin("cutii.in");
ofstream fout("cutii.out");
short int arb[3*dim],sol[dim],teste,t,i,pozst,pozdr,Max,rez,ret,n,adev[3*dim];
struct cub
{
    short int x;
    short int y;
    short int z;
}v[dim];
int cmp(cub o, cub p)
{
    return o.x<p.x;
};
int query(int nod, int st, int dr)
{
    if(st==dr)
        return adev[nod];
    int mijl=(st+dr)/2;
    if(arb[2*nod]<ret&&arb[2*nod+1]<ret)
    {
        if(arb[2*nod]>arb[2*nod+1]&&pozst<=mijl)
            query(2*nod,st,mijl);
        else
            if(arb[2*nod+1]>arb[2*nod]&&pozdr>mijl)
                query(2*nod+1,mijl+1,dr);
    }
    else
        if(arb[2*nod]<ret&&pozst<=mijl)
            query(2*nod,st,mijl);
        else
            if(arb[2*nod+1]<ret&&pozdr>mijl)
                query(2*nod+1,mijl+1,dr);
}
void upDate(int nod, int st, int dr)
{
    if(st==dr)
    {
        arb[nod]=ret;
        adev[nod]=i;
        return;
    }
    int mijl=st+(dr-st)/2;
    if(v[i].y<=mijl)
        upDate(2*nod,st,mijl);
    else
        upDate(2*nod+1,mijl+1,dr);
    arb[nod]=min(arb[2*nod],arb[2*nod+1]);
}
int main()
{
    fin>>n>>teste;
    for(t=1;t<=teste;t++)
    {
        Max=0;
        for(i=1;i<=3*dim;i++)
        {
            arb[i]=3800;
            adev[i]=0;
        }
        for(i=1;i<=n;i++)
            sol[i]=0;
        for(i=1;i<=n;i++)
            fin>>v[i].x>>v[i].y>>v[i].z;
        sort(v+1,v+n+1,cmp);
        for(i=1;i<=n;i++)
        {
            pozst=1;
            pozdr=v[i].y-1;
            ret=v[i].z;
            rez=0;
            rez=query(1,1,n);
            sol[i]=sol[rez]+1;
            if(sol[i]>Max)
                Max=sol[i];
            upDate(1,1,n);
        }
        fout<<Max<<'\n';
    }
    return 0;
}