Cod sursa(job #3154204)

Utilizator SSKMFSS KMF SSKMF Data 3 octombrie 2023 19:15:35
Problema Marbles Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <fstream>
#include <algorithm>
using namespace std;

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

pair <int , short> bile[100001];
int aparitii[65][100001];

int main ()
{
    int numar_bile , numar_operatii;
    cin >> numar_bile >> numar_operatii;

    for (int indice = 1 ; indice <= numar_bile ; indice++)
        cin >> bile[indice].first >> bile[indice].second;

    sort(bile + 1 , bile + numar_bile + 1);

    for (int indice_1 = 1 ; indice_1 <= numar_bile ; indice_1++)
    {
        for (int indice_2 = 1 ; indice_2 <= 64 ; indice_2++)
            aparitii[indice_2][indice_1] = aparitii[indice_2][indice_1 - 1];

        aparitii[bile[indice_1].second][indice_1]++;
    }

    for (int indice = 1 , tip ; indice <= numar_operatii ; indice++)
    {
        cin >> tip;

        if (!tip) 
        {
            int coordonata , termen;
            cin >> coordonata >> termen;

            int stanga = 1 , dreapta = numar_bile;
            while (stanga <= dreapta)
            {
                const int mijloc = (stanga + dreapta) >> 1;
                if (bile[mijloc].first == coordonata)
                    { bile[mijloc].first += termen; break; }

                if (bile[mijloc].first < coordonata)
                    stanga = mijloc + 1;
                else
                    dreapta = mijloc - 1;
            }
        } 
        else 
        {
            int inceput , sfarsit;
            cin >> inceput >> sfarsit;

            int stanga = 1 , dreapta = numar_bile , pozitie_stanga = 1;
            while (stanga <= dreapta)
            {
                const int mijloc = (stanga + dreapta) >> 1;
                if (bile[mijloc].first >= inceput)
                    { dreapta = mijloc - 1; pozitie_stanga = mijloc; }
                else
                    stanga = mijloc + 1;
            }

            int pozitie_dreapta = 0;
            stanga = 1; dreapta = numar_bile;
            while (stanga <= dreapta)
            {
                const int mijloc = (stanga + dreapta) >> 1;
                if (bile[mijloc].first <= sfarsit)
                    { stanga = mijloc + 1; pozitie_dreapta = mijloc; }
                else
                    dreapta = mijloc - 1;
            }

            if (inceput <= bile[pozitie_stanga].first && bile[pozitie_stanga].first <= sfarsit)
            {
                int maxim = 0;
                for (int culoare = 1 ; culoare <= 64 ; culoare++)
                    maxim = max(maxim , aparitii[culoare][pozitie_dreapta] - aparitii[culoare][pozitie_stanga - 1]);

                cout << maxim << '\n';
            }
            else
                cout << "0\n";
        }
    }

    cout.close(); cin.close();
    return 0;
}