Cod sursa(job #1089580)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 21 ianuarie 2014 19:40:32
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 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, short lx, short rx, short ly, short 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 > midx && Y > midy) query (node*4+1,midx+1,rx,midy+1,ry);
}

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

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

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

    arb[node] = max (arb[node],arb[wh]);
}

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);
        }

        fout<<arb[1]<<"\n";
    }
}