Cod sursa(job #1412984)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 1 aprilie 2015 17:59:40
Problema Marbles Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <cstdio>
#include <vector>
#include <algorithm>

#define f first
#define s second

using namespace std;

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

inline int cb (long long x)
{
    int a = 0, b = v.size () - 1;
    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 n, m;
    scanf ("%d %d", &n, &m);

    for (int i = 1; i <= n; ++i)
    {
        long long x;
        int y;
        scanf ("%lld", &x);
        scanf ("%d", &y);
        v.push_back (make_pair (x, y));
    }

    sort (v.begin (), v.end ());

    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);
            pair <long long, int> a = v[b];
            v.erase (v.begin () + b);

            a.f += y;
            b = cb (a.f);
            v.insert (v.begin () + b, a);
        }

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

            for (int j = a; j <= b; ++j)
                frq[v[j].s] = 0;

            int ma = 0;
            for (int j = a; j <= b; ++j)
            {
                ++frq[v[j].s];
                ma = max (ma, frq[v[j].s]);
            }

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

    return 0;
}