Cod sursa(job #1413763)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 2 aprilie 2015 08:18:04
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#include <algorithm>

#define f first
#define s second

using namespace std;

pair <long long, int> v[100010];
int frq[128][100010], n;

inline int cb (long long x)
{
    int a = 1, b = n;
    while (a <= b)
    {
        int m = (a + b) >> 1;

        if (v[m].f == x) return m;
        if (v[m].f > x) b = m - 1;
        else a = m + 1;
    }

    return a;
}

int main ()
{
    freopen ("marbles.in", "r", stdin);
    freopen ("marbles.out", "w", stdout);

    int m;
    scanf ("%d %d", &n, &m);

    int mi = 128, ma = 0;
    for (int i = 1; i <= n; ++i)
    {
        scanf ("%lld", &v[i].f);
        scanf ("%d", &v[i].s);

        ma = max (ma, v[i].s);
        mi = min (mi, v[i].s);
    }

    sort (v + 1, v + n + 1);

    for (int i = 1; i <= n; ++i)
    {
        for (int j = mi; j <= ma; ++j)
            frq[j][i] = frq[j][i - 1];

        ++frq[v[i].s][i];
    }

    for (int i = 1; i <= m; ++i)
    {
        int op;
        long long x, y;
        scanf ("%d", &op);
        scanf ("%lld %lld", &x, &y);

        if (!op)
        {
            int b = cb (x);
            v[b].f += y;
        }

        else
        {
            int a = cb (x);
            int b = cb (y);
            if (v[b].f != y) --b;

            int ma2 = 0;
            for (int j = mi; j <= ma; ++j)
                ma2 = max (ma2, frq[j][b] - frq[j][a - 1]);

            printf ("%d\n", ma2);
        }
    }

    return 0;
}