Pagini recente » Cod sursa (job #1605259) | Cod sursa (job #1846066) | Cod sursa (job #965809) | Cod sursa (job #1536971) | Cod sursa (job #2042379)
#include <cstdio>
using namespace std;
class Aib{
private:
int sir[100005];
int n;
int specialPower(int x){
return ((x ^ (x - 1)) & x);
}
int sumToElemnt(int x){
int sum = 0;
while(x > 0){
sum += sir[x];
x -= specialPower(x);
}
return sum;
}
public:
Aib(int l){
n = l;
for(int i = 0; i <= l; i++){
sir[i] = 0;
}
}
void add(int poz, int val){
while(poz <= n){
sir[poz] += val;
poz += specialPower(poz);
}
}
int sum(int start, int end){
return sumToElemnt(end) - sumToElemnt(start - 1);
}
int querry(int a){
int st = 1;
int dr = n;
while(st < dr){
int m = (st + dr) / 2;
int nr = sumToElemnt(m);
if(nr == a){
dr = m;
}
else if(nr > a){
dr = m - 1;
}
else if(nr < a){
st = m + 1;
}
}
return st;
}
};
int main() {
// freopen("aib.in", "r", stdin);
// freopen("aib.out", "w", stdout);
int n, m;
scanf("%d %d", &n, &m);
Aib aib(n);
for(int i = 0; i < n; i++){
int tmp;
scanf("%d", &tmp);
aib.add(i + 1, tmp);
}
for(int i = 0; i < m; i++){
int caz;
scanf("%d", &caz);
switch (caz){
case 0:
int poz, val;
scanf("%d %d", &poz, &val);
aib.add(poz, val);
break;
case 1:
int st, dr;
scanf("%d %d", &st, &dr);
printf("%d\n", aib.sum(st, dr));
break;
case 2:
int el;
scanf("%d", &el);
printf("%d\n", aib.querry(el));
break;
}
}
return 0;
}