Pagini recente » Cod sursa (job #2724042) | Cod sursa (job #6237) | Cod sursa (job #1614594) | Cod sursa (job #1174800) | Cod sursa (job #116368)
Cod sursa(job #116368)
#include <iostream>
#include <fstream>
using namespace std;
int N(0),
M(0);
int A[15001];
int bit[15001];
int mnem[15001];
int trailling_zeros(int n) {
if (0 == n)
return 0;
if (mnem[n] != 0)
return mnem[n];
int r(0);
for (int i(1); !(n & i); i <<= 1, ++r);
return mnem[n] = r;
}
void bit_mod_value(int pos, int dif) {
int i = pos;
while (i <= N) {
bit[i] += dif;
// i += 1<<trailling_zeros(i);
i += (i ^ (i-1)) & i;
}
}
void build_bit() {
for (int i(1); i <= N; ++i)
bit_mod_value(i, A[i]);
}
int bit_1range_value(int end) {
if (end <= 0)
return 0;
int i = end;
int r(0);
while (i >= 1) {
r += bit[i];
// i -= 1<<trailling_zeros(i);
i -= (i ^ (i-1)) & i;
}
return r;
}
int bit_interval_value(int p, int q) {
return bit_1range_value(q) - bit_1range_value(p - 1);
}
int main(int argc, char *argv[]) {
FILE *fin = fopen("datorii.in", "r");
ofstream fout("datorii.out");
fscanf(fin, "%d %d", &N, &M);
for (int i(1); i <= N; ++i)
fscanf(fin, "%d", &A[i]);
build_bit();
int a(0),
b(0),
c(0);
for (int i(0); i < M; ++i) {
fscanf(fin, "%d %d %d", &c, &a, &b);
if (1 == c) {
fout << bit_interval_value(a, b) << endl;
} else {
bit_mod_value(a, -b);
}
}
fout.close();
fclose(fin);
return 0;
}