Cod sursa(job #1089512)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 21 ianuarie 2014 19:00:46
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <fstream>
#include <cstring>

using namespace std;

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

short n,t,val,X,Y;
short arb[3501*3501*2];
short x[3501],y[3501],z[3501],v[3501];

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

void query (int node, int lx, int rx, int ly, int ry)
{
    if (rx <= X && ry <= Y)
    {
        val = max(val,arb[node]);
        return;
    }

    int midx = (lx+rx)/2;
    int midy = (ly+ry)/2;

    query (node*4-2,lx,midx,ly,midy);
    if (X > midx) query (node*4-1,midx+1,rx,ly,midy);
    if (Y > midy) query (node*4,lx,midx,midy+1,ry);
    if (X > midy && Y > midy) query (node*4+1,midx+1,rx,midy+1,ry);
}

void update (int node, int lx, int rx, int ly, int ry)
{
    if (lx == rx)
    {
        arb[node] = val;
        return;
    }

    int midx = (lx+rx)/2;
    int midy = (ly+ry)/2;

    if (X <= midx && Y <= midy) update (node*4-2,lx,midx,ly,midy);
    else if (X > midx && Y<= midy) update (node*4-1,midx+1,rx,ly,midy);
    else if (X <= midx && Y > midy) update (node*4,lx,midx,midy+1,ry);
    else update (node*4+1,midx+1,rx,midy+1,ry);

    arb[node] = max (max (arb[node*4-2],arb[node*4-1]), max(arb[node*4],arb[node*4+1]));
}

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

    for (;t; --t)
    {
        for (int i=1; i<=n; ++i)
        {
            fin>>x[i]>>y[i]>>z[i];
            v[x[i]] = i;
        }

        memset (arb,0,sizeof(arb));

        for (int i=1; i<=n; ++i)
        {
            X = y[v[i]]-1; Y = z[v[i]]-1;
            val = 0;
            if (X!=0 && Y!=0) query (1,1,n,1,n);
            val++;

            X++; Y++;
            update (1,1,n,1,n);
        }

        X=n; Y=n;
        val = 0;
        query (1,1,1,n,n);
        fout<<val<<"\n";
    }
}