Pagini recente » Cod sursa (job #294477) | Cod sursa (job #1601967) | Cod sursa (job #1245869) | Cod sursa (job #1752766) | Cod sursa (job #2847757)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("marbles.in");
ofstream fout("marbles.out");
int n, m, col_max;
int len[65];
vector<int> L[65];
int culoare[100003];
void Citire()
{
int i, x, color;
fin >> n >> m;
for (i = 1; i <= n; i++)
{
fin >> x >> color;
L[color].push_back(x);
col_max = max(col_max, color);
}
}
int CB_main(int x, int C)
{
int st, dr, mij;
st = 0; dr = L[C].size() - 1;
while (st <= dr)
{
mij = (st + dr) / 2;
if (x == L[C][mij]) return mij;
else if (x > L[C][mij]) st = mij + 1;
else dr = mij - 1;
}
return -1;
}
void IterareCulori(int x, int y)
{
int i, pos;
for (i = 1; i <= col_max; i++)
{
pos = CB_main(x, i);
// elementul de pe pozitia x apartine vectorului de culoare y
if (pos != -1)
{
L[i][pos] = x + y;
return;
}
}
}
int CB_dreapta(int x, int C)
{
int st, dr, mij, p = -1;
st = 0; dr = L[C].size() - 1;
while (st <= dr)
{
mij = (st + dr) / 2;
if (L[C][mij] <= x)
{
p = mij;
st = mij + 1;
}
else dr = mij - 1;
}
return p;
}
int CB_stanga(int x, int C)
{
int st, dr, mij, p = -1;
st = 0; dr = L[C].size() - 1;
while (st <= dr)
{
mij = (st + dr) / 2;
if (L[C][mij] >= x)
{
p = mij;
dr = mij - 1;
}
else st = mij + 1;
}
return p;
}
int IntervalCuloareMaxima(int x, int y)
{
int i, st, dr, nr, cnt = 0;
for (i = 1; i <= col_max; i++)
{
st = CB_dreapta(y, i);
dr = CB_stanga(x, i);
nr = st - dr + 1;
if (st == -1 && dr == -1) nr = 0;
else if (st == -1 || dr == -1) nr = 1;
cnt = max(cnt, nr);
}
return cnt;
}
void Rezolva()
{
int i, x, y, q, pos;
for (i = 1; i <= col_max; i++)
sort(L[i].begin(), L[i].end());
for (i = 1; i <= m; i++)
{
fin >> q >> x >> y;
if (q == 0) IterareCulori(x, y);
else fout << IntervalCuloareMaxima(x, y) << '\n';
}
}
int main()
{
Citire();
Rezolva();
fin.close();
fout.close();
return 0;
}