Pagini recente » Cod sursa (job #642486) | Cod sursa (job #1437029) | Cod sursa (job #1055228) | Cod sursa (job #2896254) | Cod sursa (job #2907485)
#include <fstream>
#include <iostream>
#define MAX 100010
using namespace std;
int aib[MAX];
int n;
void update(int idx, int val_to_add){
while(idx <= n){
aib[idx] += val_to_add;
idx += (idx & -idx);
}
}
int cumulative_sum(int idx){
int sum = 0;
while(idx){
sum += aib[idx];
idx -= (idx & -idx);
}
return sum;
}
int bin_search(int sum, int l, int r){
if(l == r)
if(cumulative_sum(l) == sum)
return l;
else
return -1;
int mid = (l + r) / 2;
int test = cumulative_sum(mid);
if(sum <= test)
return bin_search(sum, l, mid);
else
return bin_search(sum, mid + 1, r);
}
int main(){
ifstream fin;
ofstream fout;
fin.open("aib.in");
fout.open("aib.out");
int m, q, a, b, i;
int val;
fin >> n >> m;
for(i=1; i <= n; ++i){
fin >> val;
update(i, val);
}
for(i=0; i < m; ++i){
fin >> q;
if(q == 0){
fin >> a >> b;
update(a, b);
}
else if(q == 1){
fin >> a >> b;
fout << cumulative_sum(b) - cumulative_sum(a - 1) << "\n";
}
else{
fin >> a;
fout << bin_search(a, 1, n) << "\n";
}
}
}