Pagini recente » Cod sursa (job #2159167) | Cod sursa (job #1992581) | Cod sursa (job #315307) | Cod sursa (job #389798) | Cod sursa (job #1151093)
#include <stdio.h>
#define nmax 1000000
using namespace std;
int s, ps[nmax], n, in;
int kk(int nr) {
int k;
k = 0;
while (!(nr & (1 << k))) {
k++;
}
return k;
}
int clef(int i) {
return i - (1 << kk(i)) + 1;
}
int update(int pos, int val) {
// a[pos] += val;
ps[pos] += val;
while (pos <= n) {
pos += (1 << kk(pos));
ps[pos] += val;
}
return 0;
}
int sum(int pos) {
int s = 0;
if (pos == 0) {
return 0;
}
s += ps[pos];
while (pos >= 1) {
if (clef(pos) == 1) {
break;
}
pos -= (1 << kk(pos));
s += ps[pos];
}
return s;
}
int inter(int a, int b) {
int x, y;
x = sum(b);
y = sum(a - 1);
return x - y;
}
int bsearch(int sm) {
int l, r, x, st;
l = 1;
r = n;
while (l <= r) {
x = (l + r) / 2;
st = sum(x);
if (st == sm) {
return x;
}
if (st > sm) {
r = x - 1;
continue;
}
if (st < sm) {
l = x + 1;
continue;
}
}
return -1;
}
int main() {
int temp, t1, t2;
// ifstream fin("binarain.txt");
// fin >> n;
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d%d", &n, &in);
for (int i = 1; i <= n; i++) {
scanf("%d", &temp);
// ps[i] = pars(i);
update(i, temp);
}
for (int i = 1; i <= in; i++) {
scanf("%d", &temp);
if (temp == 0) {
scanf("%d%d", &t1, &t2);
update(t1, t2);
}
if (temp == 1) {
scanf("%d%d", &t1, &t2);
printf("%d\n", inter(t1, t2));
}
if (temp == 2) {
scanf("%d", &t1);
printf("%d\n", bsearch(t1));
}
}
return 0;
}