Nu aveti permisiuni pentru a descarca fisierul grader_test20.ok
Cod sursa(job #1541775)
Utilizator | Data | 4 decembrie 2015 15:51:27 | |
---|---|---|---|
Problema | Arbori indexati binar | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.3 kb |
#include<cstdio>
using namespace std;
const int NMAX = 100000;
int N, M;
int AIB[NMAX + 5];
void update(int poz, int val) {
for (int i = poz; i <= N; i += i & (-i))
AIB[i] += val;
}
int query(int poz) {
int ans = 0;
for (int i = poz; i >= 1; i -= i & (-i))
ans += AIB[i];
return ans;
}
int search(int a) {
int lo = 1, hi = N, mi, s;
while (lo <= hi) {
mi = (lo + hi) / 2;
s = query(mi);
if (s < a) lo = mi + 1;
if (s > a) hi = mi - 1;
if (s == a) return mi;
}
return -1;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d%d", &N, &M);
for (int i = 1, x; i <= N; i++) {
scanf("%d", &x);
update(i, x);
}
for (int i = 1, op, a, b; i <= M; i++) {
scanf("%d", &op);
if (op == 0) {
scanf("%d%d", &a, &b);
update(a, b);
continue;
}
if (op == 1) {
scanf("%d%d", &a, &b);
printf("%d\n", query(b) - query(a - 1));
continue;
}
if (op == 2) {
scanf("%d", &a);
printf("%d\n", search(a));
continue;
}
}
return 0;
}