Pagini recente » Clasament simulare_oni_z2_2k8 | Cod sursa (job #1463846) | Cod sursa (job #2299044) | Cod sursa (job #3030664) | Cod sursa (job #2016629)
#include <bits/stdc++.h>
using namespace std;
const int MaxN = 1e5 + 10;
int AIB[MaxN];
int zeros(int x){
return (x^(x-1)&x);
}
void add(int n, int ind, int val){
for(int i = ind; i <= n; i += zeros(i)){
AIB[i] += val;
}
}
int query(int n, int ind){
int ans = 0;
for(int i = ind; i > 0; i -= zeros(i)){
ans += AIB[i];
}
return ans;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int n;
scanf("%d", &n);
int m;
scanf("%d", &m);
for(int i = 1, a; i <= n; ++i){
scanf("%d", &a);
add(n, i, a);
}
for(int i = 0;i < m; ++i){
int cd, a, b;
scanf("%d", &cd);
if(cd < 2){
scanf("%d%d", &a, &b);
}
else scanf("%d", &a);
if(cd == 0){
add(n, a, b);
}
if(cd == 1){
printf("%d\n", query(n, b) - query(n, a-1));
}
if(cd == 2){
int best = 0;
int log = 1 << (31 - __builtin_clz((unsigned)n));
for(; log; log >>= 1){
if(best+log <= n && query(n, best+log) <= a){
best += log;
}
}
if(query(n, best) == a) printf("%d\n", best);
else printf("-1\n");
}
}
return 0;
}