Cod sursa(job #2953028)
Utilizator | Ivan 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;
}