Cod sursa(job #317900)

Utilizator FlorianFlorian Marcu Florian Data 25 mai 2009 21:03:52
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#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;
}