Cod sursa(job #555760)

Utilizator tudorsTudor Siminic tudors Data 15 martie 2011 19:11:40
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <stdio.h>
#include <algorithm>
#define N 100101
using namespace std;

typedef struct {long cord,cul;} BILA;
BILA A[N];
long S[65][N];
long n,m,cod,a,b,rez;

FILE *f, *g;

bool operator < (const BILA &a, const BILA &b)
{
	if (a.cord<=b.cord)
		return 1;
	else
		return 0;
}

void citire()
{
	int i,j,p;
	fscanf(f,"%ld %ld",&n,&m);
	for (i=1;i<=n;++i)
		fscanf(f,"%ld %ld",&A[i].cord,&A[i].cul);
	sort(A+1,A+n+1);
	for (i=1;i<=n;++i)
	{
		p=A[i].cul;
		S[p][i]=S[p][i-1]+1;
		for (j=1;j<=64;++j)
			if (j!=p)
				S[j][i]=S[j][i-1];
	}
}

int caut_bin(long x)
{
	int st,dr,mij;
	st=1;
	dr=n;
	while (st<=dr)
	{
		mij=(st+dr)/2;
		if (A[mij].cord<=x)
			st=mij+1;
		else
			dr=mij-1;
	}
	return dr;
}

void solve()
{
	int i,q,z,j;
	for (i=1;i<=m;++i)
	{
		fscanf(f,"%ld %ld %ld",&cod,&a,&b);
		if (!cod)
		{
			q=caut_bin(a);
			A[q].cord+=b;
		}
		else
		{
			q=caut_bin(a);
			if (A[q].cord<a)
				q++;
			z=caut_bin(b);
			rez=0;
			for (j=1;j<=64;++j)
				if (S[j][z]-S[j][q-1]>rez)
					rez=S[j][z]-S[j][q-1];
			fprintf(g,"%ld\n",rez);
		}
	}
}

int main()
{
	f=fopen("marbles.in","r");
	g=fopen("marbles.out","w");
	
	citire();
	solve();
	
	fclose(f);
	fclose(g);
	return 0;
}