Cod sursa(job #1595041)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 9 februarie 2016 21:37:17
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define x second.first
#define y second.second
#define z first
using namespace std;

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

using VI = vector<int>;
using VVI = vector<VI>;
using VIII = vector<pair<int, pair<int, int>>>;

int n, t, answ, s;
VVI a;
VIII c;

void Read();
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;
    a = VVI(n + 1, VI(n + 1));
    c = VIII(n + 1);
    while ( t-- )
    {
        Read();
        answ = 0;
        for ( int i = 1; i <= n; ++i )
        {
            s = Sum(c[i].x - 1, c[i].y - 1) + 1;
            Update(c[i].x, c[i].y, s);
            answ = max(answ, s);
        }
        os << answ << "\n";
        if ( t )
            for ( int i = 1; i <= n; ++i )
                Clear(c[i].x, c[i].y);
    }
    is.close();
    os.close();
    return 0;
}

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

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 )
            a[i][j] = max(a[i][j], val);
}

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

void Read()
{
    for ( int i = 1; i <= n; ++i )
        is >> c[i].z >> c[i].x >> c[i].y;
    sort(c.begin() + 1, c.begin() + n + 1);
}