Pagini recente » Cod sursa (job #2426653) | Cod sursa (job #1434601) | Cod sursa (job #1142647) | Cod sursa (job #2527111) | Cod sursa (job #317900)
Cod sursa(job #317900)
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAX_N 100002
int P[MAX_N];
int N,M, maxc;
int f[MAX_N][65]; // f[i][c] = de cate ori apare culoarea c pe intervalul [1..i]
struct Bila
{
int x, c;
};
Bila a[MAX_N];
inline int bs1(int p) // pozitia cea mai mica a.i. P[m] >= p
{
int i,j,m;
i = 1; j = N;
while(i<=j)
{
m = (i+j)/2;
if(P[m] >= p && ( m==1 || P[m-1] < p)) return m;
else if(P[m] < p) i = m+1;
else j = m-1;
}
return -1;
}
inline int bs2(int k) // pozitia cea mai mare a.i. P[m] <= k
{
int i,j,m;
i = 1; j = N;
while(i<=j)
{
m = (i+j)/2;
if(P[m] <= k && ( m==N || P[m+1] > k)) return m;
else if(P[m] > k) j = m-1;
else i = m+1;
}
return -1;
}
inline int bs(int p) // pozitia pe care se afla coordonata p
{
int i,j,m;
i = 1; j = N;
while(i<=j)
{
m = (i+j)/2;
if(P[m] == p) return m;
else if(P[m] < p) i = m+1;
else j = m-1;
}
return -1;
}
inline bool cmp(const Bila &a, const Bila &b)
{
return a.x < b.x;
}
int main()
{
freopen("marbles.in","r",stdin);
freopen("marbles.out","w",stdout);
scanf("%d%d",&N,&M);
int i,j,c,x, y, p, op, mx;
for(i=1;i<=N;++i) { scanf("%d%d",&a[i].x,&a[i].c); if(a[i].c > maxc) maxc = a[i].c; }
sort(a+1,a+N+1,cmp);
for(i=1;i<=N;++i)
{
for(j=1;j<=maxc;++j) f[i][j] = f[i-1][j];
++f[i][a[i].c];
P[i] = a[i].x;
}
while(M--)
{
scanf("%d%d%d",&op,&i,&j);
if(op==0)
{
p = bs(i);
P[p] += j;
}
else
{
x = bs1(i);
y = bs2(j);
mx = 0;
if(x!=-1 && y!=-1) for(c=1;c<=maxc;++c) mx = max(mx, f[y][c] - f[x-1][c]);
printf("%d\n",mx);
}
}
return 0;
}