Pagini recente » Cod sursa (job #2865728) | Cod sursa (job #1683023) | Cod sursa (job #561168) | Cod sursa (job #1322031) | Cod sursa (job #852364)
Cod sursa(job #852364)
/*
* =====================================================================================
*
* 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;
}