Pagini recente » Cod sursa (job #2952941) | Cod sursa (job #3205417) | Cod sursa (job #867726) | Cod sursa (job #2692844) | Cod sursa (job #3283437)
#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;
}