Cod sursa(job #325230)

Utilizator DraStiKDragos Oprica DraStiK Data 19 iunie 2009 16:24:14
Problema Marbles Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <algorithm>
#define DIM 100005
#define CUL 65
using namespace std;
struct bila {int x,in;} a[DIM];
int s[CUL][DIM];
int n,m;
void read ()
{
	int i;
	scanf ("%d%d",&n,&m);
	for (i=1; i<=n; ++i)
		scanf ("%d%d",&a[i].in,&a[i].x);
}
int cmp (bila a,bila b)
{
	return a.in<b.in;
}
void prec ()
{
	int i,j;
	for (i=1; i<CUL; ++i)
		for (j=1; j<=n; ++j)
			if (a[j].x==i)
				s[i][j]=s[i][j-1]+1;
			else
				s[i][j]=s[i][j-1];
}
void update (int x,int y)
{
	int st,dr,mij;
	for (st=1, dr=n; st<=dr; )
	{
		mij=(st+dr)/2;
		if (a[mij].in==x)
		{
			a[mij].in+=y;
			return ;
		}
		else if (a[mij].in<x)
			st=mij+1;
		else
			dr=mij-1;
	}
}
void getmax (int x,int y)
{
	int i,maxim=0;
	for (i=1; i<CUL; ++i)
		if (s[i][y]-s[i][x-1]>maxim)
			maxim=s[i][y]-s[i][x-1];
	printf ("%d\n",maxim);
}
void ask (int x,int y)
{
	int st,dr,mij,s1,s2;
	for (st=1, dr=n; st<=dr; )
	{
		mij=(st+dr)/2;
		if ((a[mij].in<x && a[mij+1].in>x) || (a[mij].in<x && mij==n-1))
		{
			s1=mij+1;
			break;
		}
		else if (a[mij].in==x || (a[mij].in<x && mij==n))
        {
			s1=mij;
			break;
        }
		if (a[mij].in<x)
			st=mij+1;
		else
			dr=mij-1;
	}
	for (st=1, dr=n; st<=dr; )
	{
		mij=(st+dr)/2;
		if ((a[mij].in<y && a[mij+1].in>y) || (a[mij].in<y && mij==n-1))
			s2=mij+1;
		else if (a[mij].in==y || (a[mij].in<y && mij==n))
			s2=mij;
		if (a[mij].in<=y)
			st=mij+1;
		else
			dr=mij-1;
	}
	getmax (s1,s2);
}
void query ()
{
	int i,tip,x,y;
	for (i=1; i<=m; ++i)
	{
		scanf ("%d%d%d",&tip,&x,&y);
		if (tip==1)
			ask (x,y);
		else
			update (x,y);
	}
}
int main ()
{
	freopen ("marbles.in","r",stdin);
	freopen ("marbles.out","w",stdout);
	read ();
	sort (a+1,a+n+1,cmp);
	prec ();
	query ();
	return 0;
}