Pagini recente » Cod sursa (job #365213) | Rating Denisia Marcu (denisia17) | Cod sursa (job #1757104) | Cod sursa (job #1778688) | Cod sursa (job #3172452)
#include <fstream>
#include <iostream>
#include <cmath>
#define N_MAX 15004
#define SQ_N 150
#define M_MAX 100004
using namespace std;
ifstream in ("datorii.in");
ofstream out ("datorii.out");
int n, m, sqn;
int arr[N_MAX], batog[SQ_N];
void build (){
for (int i=0; i<n; ++i){
batog[i/sqn] += arr[i];
}
}
void update (int a, int b){
batog[a/sqn] -= b;
arr[a] -= b;
}
void getSumInterval (int left, int right){
int firstInterval, lastInterval, answer = 0;
firstInterval = (left + sqn - 1) / sqn * sqn; // primul si ultimul interval care sunt cuprinse in intregime in intervalul cerut
lastInterval = right / sqn * sqn;
while (left <= right && left < firstInterval)
answer += arr[left++];
while (right >= left && right >= lastInterval)
answer += arr[right--];
firstInterval /= sqn;
lastInterval /= sqn;
while (firstInterval < lastInterval)
answer += batog[firstInterval++];
out << answer << '\n';
}
int main (){
in >> n >> m;
sqn = sqrt(n);
for (int i=0; i<n; ++i)
in >> arr[i];
build();
int operand, a, b;
for (int i=1; i<=m; ++i){
in >> operand >> a >> b;
if (operand == 0)
update (a-1, b);
if (operand == 1)
getSumInterval (a-1, b-1);
}
return 0;
}