Cod sursa(job #2847598)

Utilizator VladPislaruPislaru Vlad Rares VladPislaru Data 11 februarie 2022 08:52:53
Problema Marbles Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <bits/stdc++.h>

using namespace std;


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

int n, m;
vector <int> L[66];
short color[100005];

int CB1 (int x , int c)
{
    int st = 0, dr = L[c].size() - 1, mij;
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        if (L[c][mij] == x)
            return mij;
        if (L[c][mij] < x)
            st = mij + 1;
        else dr = mij - 1;
    }
    return 0;
}


/// cel mai din stanga element mai mare sau egal cu x
int CB2(int x, int c)
{
    int st = 0, dr = L[c].size() - 1, mij, p = 0;
    if (L[c][0] >= x)
        return 0;
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        if (L[c][mij] >= x)
        {
            p = mij;
            dr = mij - 1;
        }
        else st = mij + 1;
    }
    return p;
}

/// cel mai din dreapta element mai mic sau egal cu x
int CB3(int x, int c)
{
    int st = 0, dr = L[c].size() - 1, mij, p = 0;
    if (L[c][dr] <= x)
        return dr;
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        if (L[c][mij] <= x)
        {
            p = mij;
            st = mij + 1;
        }
        else dr = mij - 1;
    }
    return p;
}

int main()
{
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        int x,  y;
        fin >> x >> y;
        L[y].push_back(x);
        color[x] = y;
    }
    for (int i = 1; i <= 64; i++)
        if (L[i].size() > 0)
            sort (L[i].begin(), L[i].end());
    for (int i = 1; i <= m; i++)
    {
        int q, x , y;
        fin >> q >> x >> y;
        if (q == 0)
        {
            int c = color[x];
            if (L[c].size() > 0)
            {
                int poz = CB1(x, c);
                L[c][poz] = x + y;
            }
        }
        else
        {
            int max_val = 0;
            for (int i = 1; i <= 64; i++)
                if (L[i].size() > 0)
                {
                    int p1 = CB2(x, i);
                    int p2 = CB3(y, i);
                    max_val = max(max_val, p2 - p1 + 1);
                }
            fout << max_val << "\n";
        }
    }
    return 0;
}