操作格子

iamzxf發表於2014-11-23

    有n個格子,從左到右放成一排,編號為1-n

共有m次操作,有3種操作型別:

    1.修改一個格子的權值,

    2.求連續一段格子權值和,

    3.求連續一段格子的最大值。

    對於每個23操作輸出你所求出的結果。


輸入格式

第一行2個整數nm

接下來一行n個整數表示n個格子的初始權值。

接下來m行,每行3個整數p,x,yp表示操作型別,p=1時表示修改格子x的權值為yp=2時表示求區間[x,y]內格子權值和,p=3時表示求區間[x,y]內格子最大的權值。

輸出格式

有若干行,行數等於p=23的操作總數。

每行1個整數,對應了每個p=23操作的結果。

樣例輸入

4 3
1 2 3 4
2 1 3
1 4 3
3 1 4

樣例輸出

6
3

資料規模與約定

對於20%的資料n <= 100m <= 200

對於50%的資料n <= 5000m <= 5000

對於100%的資料1 <= n <= 100000m <= 1000000 <= 格子權值 <= 10000


大一的可以用來練手,控制如何輸入輸出,參考程式碼如下:

#include <stdio.h>

int main()
{
	int n,m;
	int *a;
	int i,j,k;
	int p,x,y;
	int sum, max;
	int **input;


	scanf("%d%d",&n,&m);
	a=new int[n];
	input=new int *[m];

	for(k=0;k<m;k++)
		input[k]=new int [3];

	for(i=0;i<n;i++)
		scanf("%d",a+i);

	for(i=0;i<m;i++)
		scanf("%d%d%d",&input[i][0],&input[i][1],&input[i][2]);
	
	for(i=0;i<m;i++)
	{
		p=input[i][0]; x=input[i][1]; y=input[i][2];

		switch(p)
		{
		case 1: a[x-1]=y; break;
		case 2:
			sum=0;
			for(j=x-1;j<y;j++)
				sum+=a[j];		
			break;
		case 3:
			max=a[x-1];
			for(j=x;j<y;j++)
				if(a[j]>max)
					max=a[j];
			
		}
		switch(p)
		{
		case 2:
			printf("%d\n",sum);
			break;
		case 3:
			printf("%d\n",max);
		}
	}

	return 0;
}




相關文章