Cod sursa(job #1184049)

Utilizator dalv_1337Pasita Vlad dalv_1337 Data 10 mai 2014 22:38:14
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int nMax = 100001;
const int nrCul = 64;

int n, m, cul_max, nr[nrCul+1][nMax];
struct interval{ int x, y; } v[nMax];
	
inline bool cmp(interval a,interval b)
{	return (a.x < b.x);   }

inline int bin_search(int li,int ls,int k)
{
	int mij;
	while (li<=ls) {
		mij=(li+ls)>>1;
		if (v[mij].x==k) break;
		v[mij].x<k ? li=mij+1 : ls=mij-1;
	}
	return mij;
}

inline int bin_search_st(int li,int ls,int k)
{
	int mij;
	while (li<=ls) {
		mij=(li+ls)>>1;
		v[mij].x<k ? li=mij+1 : ls=mij-1;
	}
	return li;
}

inline int bin_search_dr(int li,int ls,int k)
{
	int mij;
	while (li<=ls) {
		mij=(li+ls)>>1;
		v[mij].x>k ? ls=mij-1 : li=mij+1;
	}
	return ls;
}

inline void sol(int li,int ls)
{
	int maxim=0, i;
	for (--li,i=1; i<=cul_max; ++i)
		if (nr[i][ls]-nr[i][li]>maxim) maxim=nr[i][ls]-nr[i][li];
	printf("%d\n",maxim);
}

void Init();

int main()
{
	freopen("marbles.in","r",stdin);
	freopen("marbles.out","w",stdout);
	
	Init();
	
	int li, ls, mij, t, x, y, i;
	for (i=1; i<=m; ++i) {
		scanf("%d%d%d",&t,&x,&y);
		if (!t) {
			mij = bin_search(1,n,x);
			v[mij].x+=y;
		}
		else {
			li = bin_search_st(1,n,x);
			ls = bin_search_dr(1,n,y);
			sol(li,ls);
		}
	}
	return 0;
}

void Init()
{
	scanf("%d%d",&n,&m);
	int i, j;
	for (i=1; i<=n; ++i){
		scanf("%d%d",&v[i].x,&v[i].y);
		if (v[i].y>cul_max) cul_max=v[i].y;
	}
	sort(v+1,v+n+1,cmp);

	for (i=1; i<=n; ++i)
	  for (j=1; j<=cul_max; ++j) nr[j][i]=nr[j][i-1]+(v[i].y==j);
}