Cod sursa(job #747951)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 12 mai 2012 09:14:54
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <algorithm>
#include <cstring>

using namespace std;

const int maxn = 3505;
struct cutii {
    int a;
    int b;
    int c;
};
cutii c[maxn];

int aib[maxn][maxn], n, t, sol;

int cmp(cutii a, cutii b)
{
    return a.a < b.a;
}

int lsb(int x)
{
    return (x & (x - 1)) ^ x;
}

int query(int a, int b)
{
    int i, j, sol = 0;
    for(i = a; i >= 1; i -= lsb(i))
        for(j = b; j >= 1; j -= lsb(j))
            sol += aib[i][j];
    return sol;
}

void update(int a, int b, int c)
{
    int i, j;
    for(i = a; i <= n; i += lsb(i))
        for(j = b; j <= n; j += lsb(j))
            aib[i][j] += c;
}

int main()
{
    int test, i, j;
    ifstream f ("cutii.in");
    ofstream g ("cutii.out");
    f >> n >> t;
    for(test = 1; test <= t; ++test) {
        sol = 0;
        memset(aib, 0, sizeof(aib));
        for(i = 1; i <= n; ++i)
           f >> c[i].a >> c[i].b >> c[i].c;
        sort(c + 1, c + n + 1, cmp);
        for(i = 1; i <= n; ++i) {
            j = i;
            while(c[j].a == c[i].a) {
                sol += query(c[j].b - 1, c[j].c - 1);
                ++j;
            }
            j = i;
            while(c[j].a == c[i].a) {
                update(c[j].b, c[j].c, 1);
                ++j;
            }
            i = j - 1;
        }
        g << sol << "\n";
    }
    return 0;
}