Cod sursa(job #1133160)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 4 martie 2014 15:54:34
Problema Marbles Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <cstdio>
#include <cassert>

#include <algorithm>

using namespace std;

const int MAX_C = 64;
const int MAX_N = 100000;

int N, Q, Sums[MAX_C][MAX_N + 1];
pair<int, int> Marbles[MAX_N];

void Solve() {
    sort(Marbles, Marbles + N);
    for (int c = 0; c < MAX_C; ++c) {
        Sums[c][0] = 0;
        for (int i = 1; i <= N; ++i) {
            Sums[c][i] = Sums[c][i - 1];
            if (Marbles[i - 1].second == c)
                ++Sums[c][i];
        }
    }
    for (; Q > 0; --Q) {
        int type;
        assert(scanf("%d", &type) == 1);
        if (type == 0) {
            int where, add;
            assert(scanf("%d %d", &where, &add) == 2);
            Marbles[lower_bound(Marbles, Marbles + N, make_pair(where, -1)) - Marbles].first += add;
        } else {
            int from, to;
            assert(scanf("%d %d", &from, &to) == 2);
            if (Marbles[N - 1].first < from || to < Marbles[0].first) {
                printf("0\n");
            } else {
                from = lower_bound(Marbles, Marbles + N, make_pair(from, -1)) - Marbles;
                to = upper_bound(Marbles, Marbles + N, make_pair(to, - 1)) - Marbles - 1;
                int answer = 0;
                for (int c = 0; c < MAX_C; ++c)
                    answer = max(answer, Sums[c][to + 1] - Sums[c][from]);
                printf("%d\n", answer);
            }
        }
    }
}

void Read() {
    assert(scanf("%d %d", &N, &Q) == 2);
    for (int i = 0; i < N; ++i) {
        assert(scanf("%d %d", &Marbles[i].first, &Marbles[i].second) == 2);
        --Marbles[i].second;
    }
}

int main() {
    assert(freopen("marbles.in", "r", stdin));
    assert(freopen("marbles.out", "w", stdout));
    Read();
    Solve();
    return 0;
}