Cod sursa(job #163488)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 22 martie 2008 13:25:35
Problema Marbles Scor 0
Compilator c Status done
Runda preONI 2008, Runda Finala, Clasele 5-8 Marime 2.13 kb
#include <stdio.h>
#include <stdlib.h>
#define N 100010
#define CUL 64
struct bila{
	int coord,culoare;
};
struct bila v[N];
int n;
//cautare binara (poz inc,poz sf,valoare,tip(pt mai mic=>1,pt mai mare =>3))
int binary_search(int p, int u, int val, int tip){
	int m=17;
	while (p<u){
		m=(p+u)/2;
		if (v[m].coord<val)
			p=m+1;
		else if (v[m].coord==val)
		     return m;
		else
			u=m;
	}
	if (tip==1)
		if (v[m].coord>val)
			--m;
	if (tip==3)
		if (v[m].coord<val)
			++m;
	return m;
}
void exchange(int i,int j){
	int pivot,z,y;
	struct bila aux;
	/*if (j>0){
		z=binary_search(0,n-1,i+j,1);
		pivot=binary_search(0,n-1,i,2);
		aux.coord=v[i].coord;
		aux.culoare=v[i].culoare;
		if (z>pivot){
			for (y=z;y>pivot;--y){
				v[y-1].culoare=v[y].culoare;
				v[y-1].coord=v[y].coord;
			}
			v[z].culoare=v[pivot].culoare;
			v[z].coord=v[pivot].coord;
		}
		if (z==pivot)
			v[pivot].coord+=j;
	}
	if (j<0){
		z=binary_search(0,n-1,i+j,3);
		pivot=binary_search(0,n-1,4,2);
		//printf("%d %d\n",z,pivot);
		aux.coord=v[pivot].coord;
		aux.culoare=v[pivot].culoare;
		if (z<pivot){
           for (y=z;y<pivot;++y){
		       v[y+1].culoare=v[y].culoare;
			   v[y+1].coord=v[y].coord;
		    }
            v[z].culoare=v[pivot].culoare;
		    v[z].coord=v[pivot].coord;
        }
        if (z==pivot)
           v[pivot].coord+=j;		
	}*/
	z=binary_search(0,n-1,i,2);
	v[z].coord+=j;
}	
void inter(int i,int j){
	int a,b,ct,max=0;
	int c[CUL+1];
	for (ct=1;ct<=CUL;++ct)
		c[ct]=0;
	a=binary_search(0,n-1,i,3);
	b=binary_search(0,n-1,i+j,1);
	for (ct=a;ct<=b;++ct)
		++c[v[ct].culoare];
	for (ct=1;ct<=CUL;++ct)
		if (c[ct]>max)
			max=c[ct];
	printf("%d\n",max);	
}
void scan(){
	int i,tip,ii,jj,m;
	freopen("marbles.in","r",stdin);
	freopen("marbles.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (i=0;i<n;++i)
		scanf("%d%d",&v[i].coord,&v[i].culoare);
	for (i=0;i<m;++i){
		scanf("%d%d%d",&tip,&ii,&jj);
		if (tip==0){
			exchange(ii,jj);
		}
		else{
			inter(ii,jj);
		}
	}
}
void end(){
	fclose(stdin);
	fclose(stdout);
}
int main(){
	scan();
	end();
	return 0;
}