Cod sursa(job #3283437)

Utilizator stefanrotaruRotaru Stefan-Florin stefanrotaru Data 9 martie 2025 15:50:15
Problema Marbles Scor 0
Compilator cpp-64 Status done
Runda oji_go_11_12 Marime 2.18 kb
#include <fstream>
#include <map>
#include <algorithm>

using namespace std;

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

int n, m, x, v, y, aib[65][100005];

map <int, int> culori;

struct cv
{
    int val, index, indexNormalizare, culoareBila;
} elemente[100005];

inline bool comp1(const cv &a, const cv &b)
{
    return a.val < b.val;
}

inline bool comp2(const cv &a, const cv &b)
{
    return a.index < b.index;
}

inline int zeros(int i)
{
    return i & -i;
}

inline void update(int culoare, int poz, int val)
{
    for ( ; poz <= 100005; poz += zeros(poz)) {
        aib[culoare][poz] += val;
    }
}

inline int query(int culoare, int poz)
{
    int sum = 0;

    for ( ; poz; poz -= zeros(poz)) {
        sum += aib[culoare][poz];
    }

    return sum;
}

int main()
{
    f >> n >> m;

    for (int i = 1; i <= n; ++i) {
        int a, b;

        f >> a >> b;

        elemente[i].index = i;
        elemente[i].val = a;
        elemente[i].culoareBila = b;
    }

    sort (elemente + 1, elemente + n + 1, comp1);

    int k = 0;

    elemente[++k].indexNormalizare = k;

    for (int i = 2; i <= n; ++i) {
        if (elemente[i - 1].val == elemente[i].val) {
            elemente[i].indexNormalizare = k;
        }
        else {
            elemente[i].indexNormalizare = ++k;
        }
    }

    sort(elemente + 1, elemente + n + 1, comp2);

    for (int i = 1; i <= n; ++i) {
        culori[elemente[i].indexNormalizare] = elemente[i].culoareBila;

        update(elemente[i].culoareBila, elemente[i].indexNormalizare, 1);
    }

    for (int i = 1; i <= m; ++i) {
        f >> v >> x >> y;

        if (v == 0) {
            int culoareVeche = culori[x];

            culori.erase(x);
            culori[x + y] = culoareVeche;

            update(culoareVeche, x, -1);
            update(culoareVeche, x + y, 1);
        }
        else {
            int ans = -1;

            for (int j = 1; j <= 64; ++j) {
                int aux1 = query(j, y) - query(j, x - 1);

                ans = max(ans, aux1);
            }

            g << ans << '\n';
        }
    }

    return 0;
}