はなたの日記

ギターのコードについて書きます

DSL_2_E Range Add Query (RAQ)

問題
Range Add Query (RAQ) | Aizu Online Judge

RAQの問題です。RUQとほとんど変わらないので、簡単に実装できました。
今回はxとyが同じバケットだった場合とそうでない場合を、ifで場合分けしました。

参考
kujira16.hateblo.jp
本当に分かり易いです。

#include<stdio.h>
#include<math.h>
#include<limits.h>
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define LARGE 100001

int a[LARGE]={0};
int Add[LARGE]={0};
int b,n;

int main(){

	int q,i,j,com;
	int x,y,z;
	
	scanf("%d %d",&n,&q);
	
	b=sqrt(n);
	
	for(j=0;j<q;j++){
	
		scanf("%d",&com);
		
		if(com==1){/*get*/
			scanf("%d",&x);
			printf("%d\n",a[x]+Add[x/b]);
		}
		
		else {/*update*/
			scanf("%d %d %d",&x,&y,&z);
			if(y/b-x/b<2){
				for(i=x;i<=y;i++)a[i]+=z;
			}
			else {
				for(i=x;i<=MIN(y,(x/b+1)*b-1);i++)a[i]+=z;
			
				for(i=x/b+1;i<y/b;i++)Add[i]+=z;
			
				for(i=MAX(x,y/b*b);i<=y;i++)a[i]+=z;
				
			}
		}
		
	}
	
	return 0;
	
}

関数とか配列名とかつけるセンスがほしいですね。