Cod sursa(job #1133174)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 4 martie 2014 16:07:35
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <cstdio>
#include <cassert>

#include <algorithm>

using namespace std;

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

int N, Q, X[MAX_N], Colours[MAX_N], Sums[MAX_C][MAX_N + 1];

inline int LowerBound(const int x) {
    int left = 0, right = N - 1, position = -1;
    while (left <= right) {
        int middle = (left + right) / 2;
        if (X[middle] <= x) {
            left = middle + 1;
            position = middle;
        } else {
            right = middle - 1;
        }
    }
    return position;
}

inline int UpperBound(const int x) {
    int left = 0, right = N - 1, position = N;
    while (left <= right) {
        int middle = (left + right) / 2;
        if (x <= X[middle]) {
            right = middle - 1;
            position = middle;
        } else {
            left = middle + 1;
        }
    }
    return position;
}

void Solve() {
    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 (Colours[i - 1] == 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);
            X[LowerBound(where)] += add;
        } else {
            int from, to;
            assert(scanf("%d %d", &from, &to) == 2);
            if (X[N - 1] < from || to < X[0]) {
                printf("0\n");
            } else {
                from = UpperBound(from);
                to = LowerBound(to);
                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);
    pair<int, int> marbles[MAX_N];
    for (int i = 0; i < N; ++i) {
        assert(scanf("%d %d", &marbles[i].first, &marbles[i].second) == 2);
        --marbles[i].second;
    }
    sort(marbles, marbles + N);
    for (int i = 0; i < N; ++i) {
        X[i] = marbles[i].first;
        Colours[i] = marbles[i].second;
    }
}

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