Pagini recente » Cod sursa (job #3256262) | Cod sursa (job #3247281) | Cod sursa (job #2930247) | Cod sursa (job #2658921) | Cod sursa (job #60621)
Cod sursa(job #60621)
#include <stdio.h>
#include <time.h>
#define NMAX 100000
typedef struct {
int a, b;
int s;
} p;
p tree[NMAX];
int N, M;
int A[NMAX], cod, t, v;
int search(int a, int b, int i) {
if (tree[i].a == a && tree[i].b == b)
return tree[i].s;
else if (a <= tree[i].a && b >= tree[i].b)
return tree[i].s;
else
if (a >= tree[i].a && a <= tree[i].b) {
if (b <= tree[i].b)
return search(a, b, 2*i) + search(a, b, 2*i+1);
else
return search(a, tree[i].b, 2*i) + search(a, tree[i].b, 2*i+1);
}
else {
if (b >= tree[i].a && b <= tree[i].b)
return search(tree[i].a, b, 2*i) + search(tree[i].a, b, 2*i+1);
else
return 0;
}
}
void build(int i) {
int j;
tree[i].s = 0;
for (j = tree[i].a; j <= tree[i].b; ++j)
tree[i].s += A[j];
if (tree[i].a != tree[i].b) {
int m = (tree[i].a + tree[i].b)/2;
tree[2*i].a = tree[i].a, tree[2*i].b = m;
build(2*i);
tree[2*i+1].a = m+1, tree[2*i+1].b = tree[i].b;
build(2*i+1);
}
}
void add(int i) {
tree[i].s -= v;
if (tree[i].a != tree[i].b) {
if (t <= tree[2*i].b)
add(2*i);
else
add(2*i+1);
}
}
int main() {
FILE *fi = freopen("datorii.in", "r", stdin);
FILE *fo = freopen("datorii.out", "w", stdout);
int i;
clock_t begin, end;
begin = clock();
scanf("%d%d", &N, &M);
for (i = 1; i <= N; ++i)
scanf("%d", &A[i]);
tree[1].a = 1, tree[1].b = N;
build(1);
for (i = 0; i < M; ++i) {
scanf("%d%d%d", &cod, &t, &v);
if (cod)
printf("%d\n", search(t, v, 1));
//search(t, v, 1);
else
add(1);
}
end = clock();
printf("%d\n", end);
return 0;
}