Cod sursa(job #852364)

Utilizator Marius_mFMI-M2 Marius Melemciuc Marius_m Data 11 ianuarie 2013 05:54:09
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
/*
 * =====================================================================================
 *
 *       Filename:  datorii.cpp
 *
 *    Description:  http://infoarena.ro/problema/datorii
 *
 *        Version:  1.0
 *        Created:  01/11/2013 04:27:22 AM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  YOUR NAME (), 
 *   Organization:  
 *
 * =====================================================================================
 */

#include<iostream>
#include<cstdio>
#include<math.h>

using namespace std;

int N,M,rad;
int* v;
int* buckets;

void achitare(int zi,int valoare)
{
	zi--;
	v[zi] -= valoare;
	int bucket = zi/rad;
	buckets[bucket] -= valoare;
}

int query(int d1,int d2)
{
	d1--;             // se scad valorile lui d1 si d2 pentru ca vectorul incepe de la 0
	d2--;

	int bucket1 = d1/rad;
	int bucket2 = d2/rad;
	
	int S = 0;
	if( bucket1 == bucket2 )   
		for(int i = d1 ; i <= d2 ; i++)
			S += v[i];
	else
	{
		for(int i = d1 ; i < rad * (bucket1+1) ; i++)
			S += v[i];
		for(int i = bucket1 + 1 ; i < bucket2 ; i++)
			S += buckets[i];
		for(int i = bucket2 * rad ; i <= d2 ; i++)
			S += v[i];
	}
	return S;
}

int main()
{
	FILE *in,*out;
	in = fopen("datorii.in","r");
	out = fopen("datorii.out","w");
	fscanf(in,"%d %d",&N,&M);
	
	rad = (int)sqrt(N);

	v = new int[N + 1];
	buckets = new int[rad + 1];
	
	for(int i = 0 ; i < N ; i++)
	{
		fscanf(in,"%d",v+i);
		buckets[i/rad] += v[i];
	}

	int operation,a,b;
	for(int i = 0 ; i < M ; i++)
	{
		fscanf(in,"%d %d %d",&operation,&a,&b);
		if(operation)
			fprintf(out,"%d\n",query(a,b));
		else
			achitare(a,b);
	}
	fclose(in);
	fclose(out);
	return 0;
}