Pagini recente » Cod sursa (job #1566390) | Cod sursa (job #1075912) | Cod sursa (job #1628196) | Cod sursa (job #1834966) | Cod sursa (job #1004168)
#include <cstdio>
#define Nmax 100001
using namespace std;
int N, M, aib[Nmax];
void update(int idx, int val){
while(idx <= N){
aib[idx] += val;
idx += (idx & -idx);
}
}
int query(int idx){
int sum = 0;
while(idx > 0){
sum += aib[idx];
idx -= (idx & -idx);
}
return sum;
}
int search(int val){
int p = 1;
int u = N;
while( p <= u){
int mid = (p + u)/2;
int sum = query(mid);
if(sum == val)
return mid;
if(sum > val)
u = mid - 1;
else
p = mid + 1;
}
return -1;
}
int main(){
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d%d",&N,&M);
for(int i = 1; i <= N; ++i){
int x;
scanf("%d", &x);
update(i, x);
}
for(int i = 1; i <= M; ++i){
int t, a, b;
scanf("%d", &t);
switch(t){
case 0:
scanf("%d%d", &a, &b);
update(a, b);
break;
case 1:{
scanf("%d%d", &a, &b);
int sA = query(a -1);
int sB = query(b);
printf("%d\n", sB - sA);
break;
}
case 2:
scanf("%d", &a);
printf("%d\n", search(a));
break;
}
}
return 0;
}