Cod sursa(job #2847746)

Utilizator Stefan_BircaBirca Stefan Stefan_Birca Data 11 februarie 2022 13:12:24
Problema Marbles Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <bits/stdc++.h>

using namespace std;

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

vector <int> c[65];
int n, max_colour, len[65];

int CB(int colour, int x)
{
    int st = 0, dr = len[colour] - 1, mij;
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        if (c[colour][mij] == x) return mij;
        if (c[colour][mij] < x) st = mij + 1;
        else dr = mij - 1;
    }
    return -1;
}

void Move(int x, int y)
{
    int i, pos = 0;
    for (i = 1; i <= max_colour; i++)
    {
        pos = CB(i, x);
        if (pos != -1 && c[i][pos] == x)
        {
            c[i][pos] = x + y;
            return;
        }
    }
}

int CB_L(int colour, int x)
{
    int st, dr, mij, p = -1;
    st = 0;
    dr = len[colour] - 1;
    while(st <= dr)
    {
        mij = (st + dr) / 2;
        if (c[colour][mij] <= x)
        {
            st = mij + 1;
            p = mij;
        }
        else dr = mij - 1;
    }
    return p;
}

int CB_R(int colour, int x)
{
    int st, dr, mij, p = -1;
    st = 0;
    dr = len[colour] - 1;
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        if (c[colour][mij] >= x)
        {
            dr = mij - 1;
            p = mij;
        }
        else st = mij + 1;
    }
    return p;
}

int Ask(int x, int y)
{
    int i, cnt = 0, nr, pos1, pos2;
    for (i = 1; i <= max_colour; i++)
    {
        nr = 0;
        pos1 = CB_R(i, x);
        pos2 = CB_L(i, y);
        if (pos1 == -1 && pos2 == -1) nr = 0;
        else if (pos1 == -1 || pos2 == -1) nr = 1;
        else nr = pos2 - pos1 + 1;
        cnt = max(cnt, nr);
    }
    return cnt;
}

void Citire()
{
    int task, i, m, x, y;
    fin >> n >> m;
    for (i = 1; i <= n; i++)
    {
        fin >> x >> y;
        c[y].push_back(x);
        len[y]++;
        max_colour = max(max_colour, y);
    }
    for (i = 1; i <= max_colour; i++)
        sort(c[i].begin(), c[i].end());
    while (m--)
    {
        fin >> task >> x >> y;
        if (task == 0) Move(x, y);
        else fout << Ask(x, y) << "\n";
    }
    fin.close();
    fout.close();
}

int main()
{

    Citire();

    return 0;
}