Pagini recente » Cod sursa (job #861673) | Cod sursa (job #1432659) | Cod sursa (job #2254378) | Cod sursa (job #190283) | Cod sursa (job #911473)
Cod sursa(job #911473)
#include <cstdio>
#define nMax 100100
using namespace std;
int n;
int a[nMax];
void add(int i, int val){
int k = 0;
while(i <= n){
a[i] += val;
while((i & (1 << k)) == 0){
k ++;
}
i += 1 << k;
k ++;
}
return;
}
int ceaMaiMareP(int x){
int k = 0;
while(1 << k <= x){
k ++;
}
return 1 << (k - 1);
}
int unuX(int x){
int s = 0;
int p = 0;
while (p != x){
p += ceaMaiMareP(x - p);
s += a[p];
}
return s;
}
int interval(int st, int dr){
return unuX(dr) - unuX(st - 1);
}
void doi(int SC){
int st = 1;
int dr = n + 1;
int mij;
int s = 0;
while(st != dr){
mij = (st + dr) >> 1;
s = unuX(mij);
if(SC == s){
break;
}
if(s > SC){
dr = mij;
}else{
st = mij + 1;
}
}
if(s == SC){
printf("%d\n", mij);
}else{
printf("-1\n");
}
}
void citire(){
int m;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; ++ i){
int x;
scanf("%d", &x);
add(i, x);
}
while(m --){
int caz;
int x;
int y;
scanf("%d %d", &caz, &x);
if(caz == 0){
scanf("%d", &y);
add(x, y);
}
if(caz == 1){
scanf("%d", &y);
printf("%d\n", interval(x,y));
}
if(caz == 2){
doi(x);
}
}
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
citire();
return 0;
}