Cod sursa(job #2953028)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 10 decembrie 2022 12:55:03
Problema Marbles Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <fstream>
#include <unordered_map>
#include <algorithm>

using namespace std;

ifstream in ("marbles.in");
ofstream out ("marbles.out");

const int max_size = 1e5 + 1;

int bl[65][max_size], ct[65];
unordered_map <int, int> cul;

int main ()
{
    int n, q;
    in >> n >> q;
    while (n--)
    {
        int x, c;
        in >> x >> c;
        cul[x] = c;
        bl[c][++ct[c]] = x;
    }
    for (int i = 1; i < 65; i++)
    {
        sort(bl[i] + 1, bl[i] + ct[i] + 1);
    }
    while (q--)
    {
        int op, x, y;
        in >> op >> x >> y;
        if (op == 0)
        {
            int c = cul[x];
            cul[x] = 0;
            int l = 1, r = ct[c], poz;
            while (l <= r)
            {
                int m = (l + r) / 2;
                if (bl[c][m] <= x)
                {
                    poz = m;
                    l = m + 1;
                }
                else
                {
                    r = m - 1;
                }
            }
            bl[c][poz] = x + y;
            cul[x + y] = c;
        }
        else
        {
            int mx1 = 0;
            for (int i = 1; i < 65; i++)
            {
                int cptx = 0, cpty = -1, l = 1, r = ct[i];
                while (l <= r)
                {
                    int m = (l + r) / 2;
                    if (bl[i][m] < x)
                    {
                        l = m + 1;
                    }
                    else
                    {
                        cptx = m;
                        r = m - 1;
                    }
                }
                l = 1;
                r = ct[i];
                while (l <= r)
                {
                    int m = (l + r) / 2;
                    if (bl[i][m] <= y)
                    {
                        cpty = m;
                        l = m + 1;
                    }
                    else
                    {
                        r = m - 1;
                    }
                }
                //out << cptx << " " << cpty << '\n';
                mx1 = max(mx1, cpty - cptx + 1);
            }
            out << mx1 << '\n';
        }
    }
    in.close();
    out.close();
    return 0;
}