Cod sursa(job #531435)
#include <iostream>
#include <math.h>
#define N 100005
#define M 150005
int sir[N];
int n,m;
int val;
using namespace std;
void add(int poz, int val) {
while (poz <= n) {
sir[poz]+=val;
poz += poz & -poz;
}
return;
}
int computeSum(int poz) {
int sum = 0;
while (poz > 0) {
sum += sir[poz];
poz -= poz & -poz;
}
return sum;
}
int binSrch(int val) {
int st = 1;
int dr = n;
while (st <= dr) {
int mij = (st + dr) / 2;
int s = computeSum(mij);
if (s < val) st = mij + 1;
else
if (s > val) dr = mij - 1;
else
return mij;
}
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++) {
scanf("%d",&val);
add(i,val);
}
for(int i = 1; i <= m; i++) {
int cod;
scanf("%d",&cod);
if (cod == 0) {
int a,b;
scanf("%d %d",&a,&b);
add(a,b);
}
else
if (cod == 1) {
int a,b;
scanf("%d %d",&a,&b);
printf("%d\n",computeSum(b) - computeSum(a-1));
}
else
if (cod == 2) {
scanf("%d",&val);
printf("%d\n",binSrch(val));
}
}
return 0;
}