Pagini recente » Cod sursa (job #823970) | Cod sursa (job #641214) | Cod sursa (job #1552270) | Cod sursa (job #1540974) | Cod sursa (job #2816383)
// Batog
#include <stdio.h>
#include <math.h>
#define MAX_N 15000
const int SQ_N = sqrt(MAX_N);
const int BATOG_SIZE = (MAX_N + SQ_N - 1) / SQ_N;
#define UPDATE 0
#define QUERY 1
int v[MAX_N];
int batog[BATOG_SIZE];
void build(int n) {
int i;
for (i = 0; i < n; ++i)
batog[i / SQ_N] += v[i];
}
inline void update(int pos, int decrease) {
batog[pos / SQ_N] -= decrease;
v[pos] -= decrease;
}
int query(int left, int right) {
int firstInterval, lastInterval, result;
firstInterval = (left + SQ_N - 1) / SQ_N * SQ_N;
lastInterval = right / SQ_N * SQ_N;
result = 0;
while (left <= right && left < firstInterval)
result += v[left++];
while (right >= left && right >= lastInterval)
result += v[right--];
firstInterval /= SQ_N;
lastInterval /= SQ_N;
while (firstInterval < lastInterval)
result += batog[firstInterval++];
return result;
}
int main() {
FILE *fin, *fout;
fin = fopen("datorii.in", "r");
fout = fopen("datorii.out", "w");
int n, m, i, type, a, b;
fscanf(fin, "%d%d", &n, &m);
for (i = 0; i < n; ++i)
fscanf(fin, "%d", &v[i]);
build(n);
while (m--) {
fscanf(fin, "%d%d%d", &type, &a, &b);
if (type == UPDATE)
update(a - 1, b);
else if (type == QUERY)
fprintf(fout, "%d\n", query(a - 1, b - 1));
}
fclose(fin);
fclose(fout);
return 0;
}