Cod sursa(job #795003)

Utilizator mipsPavel Mircea mips Data 7 octombrie 2012 14:32:07
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
#include <cstdio>
#include <algorithm>
using namespace std;
ofstream fout("cutii.out");
ifstream fin("cutii.in");

vector< pair< int , pair< int , int> > > cutii;

int t, n, ntree, tree[4000][4000];

int query(int x, int y)
{
    int sum = 0;
    for (int a=x; a >= 0; a = (a & (a + 1)) - 1)
        for (int b=y; b >= 0; b = (b & (b + 1)) - 1)
            sum = max(sum,tree[a][b]);
    return sum;
}

// Increases value of k-th element by inc.
void set(int x, int y, int maxim)
{
    for (int k = x; k <= ntree; k |= k + 1)
    {
        for (int kk=y; kk <= ntree; kk |= kk + 1)
            tree[k][kk]= max(maxim, tree[k][kk] );
    }
}

void unset(int x, int y)
{
    for (int k = x; k <= ntree; k |= k + 1)
    {
        for (int kk=y; kk <= ntree; kk |= kk + 1)
            tree[k][kk]=0;
    }
}

int main()
{

    fin >> n >> t;
    ntree=n+1;

    for (int tests=0; tests<t; tests++)
    {
        cutii.clear();
        for (int i=0; i<n; i++)
        {
            int a,b,c;
            fin >> a >> b >> c;
            cutii.push_back( make_pair(a,make_pair(b,c)) );
        }

        sort(cutii.begin(),cutii.end());
        int maximal =0;
        int lastRem=0;
        for (int i=0; i<n; i++)
        {
            if (i!=0)
                if (cutii[i].first != cutii[i-1].first)
                {
                    for (int j=lastRem; j<i; j++)
                    {
                        set(cutii[j].second.first , cutii[j].second.second,query(cutii[j].second.first-1,cutii[j].second.second-1)+1);
                    }
                    lastRem=i;
                }

            maximal = max(maximal,query(cutii[i].second.first-1,cutii[i].second.second-1));
        }

        for (int i=0; i<n; i++)
            unset(cutii[i].second.first,cutii[i].second.second);
        fout << maximal+1<<endl;
    }
}