Cod sursa(job #1253526)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 1 noiembrie 2014 14:01:28
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define x second.first
#define y second.second
using namespace std;

ifstream is("cutii.in");
ofstream os("cutii.out");

int n, t, a1, a2, a3, answ, sum;
int aib[3501][3501];
vector<pair<int, pair<int, int>>> c;

void UPDATE(int px, int py, int val);
void CLEAR(int px, int py);
int SUM(int px, int py);

int main()
{
    is >> n >> t;
    while ( t-- )
    {
        for ( int i = 1; i <= n; ++i )
        {
            is >> a1 >> a2 >> a3;
            c.push_back(make_pair(a1, make_pair(a2, a3)));
        }
        answ = 0;
        sort(c.begin(), c.end());
        for ( auto i : c )
        {
            sum = SUM(i.x - 1, i.y - 1) + 1;
            UPDATE(i.x, i.y, sum);
            answ = max(answ, sum);
        }
        /*for ( int i = 1; i <= n; ++i )
        {
            for ( int j = 1; j <= n; ++j )
                os << aib[i][j] << " ";
            os << "\n";
        }*/
        for ( auto i : c )
            if ( aib[i.x][i.y] )
                CLEAR(i.x, i.y);
        os << answ << "\n";
        c.clear();
    }
    is.close();
    os.close();
}

void UPDATE(int px, int py, int val)
{
    for ( int i = px; i <= n; i += i & -i )
        for ( int j = py; j <= n; j += j & -j )
            aib[i][j] = max(aib[i][j], val);
}

void CLEAR(int px, int py)
{
    for ( int i = px; i <= n; i += i & -i )
        for ( int j = py; j <= n; j += j & -j )
            aib[i][j] = 0;
}

int SUM(int px, int py)
{
    int s = 0;
    for ( int i = px; i; i -= i & -i )
        for ( int j = py; j; j -= j & -j )
            s = max(s, aib[i][j]);
    return s;
}