Pagini recente » Cod sursa (job #838504) | Cod sursa (job #2843941) | Cod sursa (job #2823814) | Cod sursa (job #2426589) | Cod sursa (job #1133174)
#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;
}