Pagini recente » Cod sursa (job #2532359) | Cod sursa (job #636600) | Cod sursa (job #2273073) | Cod sursa (job #522413) | Cod sursa (job #191701)
Cod sursa(job #191701)
#include <math.h>
#include <stdio.h>
// Store sqrt(n) buckets of size sqrt(n). Then we can answer queries in time
// sqrt(n).
int n, m, rad;
int a[17000], bucket[130];
FILE *fin, *fout;
void preprocess() {
for (int i = 0; i < rad; i++) {
bucket[i] = 0;
}
for (int i = 0; i < n; i++) {
bucket[i / rad] += a[i];
}
}
void query(int lo, int hi) {
int result = 0;
int bLo = lo / rad;
int endLo = (bLo + 1) * rad;
int bHi = hi / rad;
int startHi = bHi * rad;
for (int b = bLo + 1; b < bHi; b++) {
result += bucket[b];
}
for (int i = lo; i < endLo; i++) {
result += a[i];
}
for (int i = startHi; i < hi; i++) {
result += a[i];
}
fprintf(fout, "%d\n", result);
}
void update(int day, int value) {
a[day] -= value;
bucket[day / rad] -= value;
}
int main(void) {
fin = fopen("datorii.in", "rt");
fout = fopen("datorii.out", "wt");
fscanf(fin, "%d %d", &n, &m);
rad = (int)sqrt(n - 1) + 1;
for (int i = 0; i < n; i++) {
fscanf(fin, "%d", &a[i]);
}
preprocess();
for (int testNum = 0; testNum < m; testNum++) {
int testType, v1, v2;
fscanf(fin, "%d %d %d", &testType, &v1, &v2);
if (testType) {
query(v1 - 1, v2);
} else {
update(v1 - 1, v2);
}
}
fclose(fin);
fclose(fout);
return 0;
}