Pagini recente » Cod sursa (job #3177539) | Cod sursa (job #3199002) | Cod sursa (job #3260636) | Cod sursa (job #3260696) | Cod sursa (job #2907392)
#include <bits/stdc++.h>
using namespace std;
int c, n, m, i, aux, x, y;
int a[100001], z[100001];
void zero();
void update(int, int);
int query(int);
int q(int);
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d%d", &n, &m);
zero();
for (i = 1; i <= n; i++){
scanf("%d", &aux);
update(i, aux);
}
for (; m; m--){
scanf("%d", &c);
switch(c)
{
case 0:
scanf("%d%d", &x, &y);
update(x, y);
break;
case 1:
scanf("%d%d", &x, &y);
printf("%d\n", query(y) - query(x - 1));
break;
default:
scanf("%d", &x);
printf("%d\n", q(x));
}
}
return 0;
}
void zero(){
for (i = 1; i <= n; i++)
z[i] = (1 << __builtin_ctz(i));
}
void update(int p, int v){
for (int i = p; i <= n; i += z[i])
a[i] += v;
}
int query(int p){
int s = 0;
for (int i = p; i > 0; i -= z[i]) s += a[i];
return s;
}
int q(int v){
for (int k = 1; k <= n; k <<= 1){
if(a[k] == v) return k;
}
return -1;
}