Cod sursa(job #725177)

Utilizator matei_cChristescu Matei matei_c Data 26 martie 2012 20:09:19
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<cstdio>
#include<cmath>

const int MAX_N = 15001 ;
const int MAX_NR = 250 ;

int n,m;
int v[MAX_N];
int nr[MAX_NR];
int nrgrupe;
int sumegrupe[MAX_NR];
int sum[MAX_NR];

int main()
{
	
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
		scanf("%d",&v[i]);
	
	int rad = (int)sqrt(n) ;
	int num  = 0 ;
	for(int i=1;i<=n;++i)
	{
		if(num>=n)
			break;
		num+=rad;
		nr[i]=rad;
		nrgrupe = i ;
	}
	if(num>n)
		nr[++nrgrupe] = n - num ;	
	
	for(int i=1;i<=nrgrupe;++i)
		sumegrupe[i] = sumegrupe[i-1] + nr[i] ;
	
	int gr=1;
	for(int i=1;i<=n;++i)
	{
		if(i>sumegrupe[gr])
			++gr;
		sum[gr]+=v[i];
	}	

	for(int i=1;i<=m;++i)
	{	
		int rez=0;
		int cod,a,b;
		scanf("%d%d%d",&cod,&a,&b);
		if(cod==0)
		{
			int grupa_a = (a-1) / rad + 1 ;	
			v[a] -= b ;			
			sum[grupa_a] -= b ;
		}
		if(cod==1)
		{
			int grupa_a = (a-1) / rad + 1 ;
			int grupa_b = (b-1) / rad + 1 ;
			if(grupa_a < grupa_b)
			{	
				for(int j=a;j<=sumegrupe[grupa_a];++j)
					rez+=v[j];
				for(int j=grupa_a + 1 ; j<= grupa_b - 1 ;++j)\
					rez+=sum[j];
				for(int j=(grupa_b-1) * rad + 1 ; j<= b ; ++j)
					rez+=v[j];
			}
			if(grupa_a == grupa_b)
				for(int j=a;j<=b;++j)
					rez+=v[j];
			if(a==b)
				rez=v[a];
			printf("%d\n",rez);
		}	
	}	
	
	return 0;
	
}