Pagini recente » Cod sursa (job #813933) | Cod sursa (job #1653911) | Cod sursa (job #242712) | Cod sursa (job #2489283) | Cod sursa (job #2750632)
#include <fstream>
using namespace std;
const int NMAX = 100000;
int aib[NMAX + 5];
int n;
void update(int poz, int val){
for(; poz <= n; poz += (poz ^ (poz & (poz - 1)))){
aib[poz] += val;
}
}
int query(int poz){
int sum = 0;
for(; poz >= 1; poz -= (poz ^ (poz & (poz - 1)))){
sum += aib[poz];
}
return sum;
}
ifstream cin("aib.in");
ofstream cout("aib.out");
int main()
{
int m, i, a, b, op;
cin >> n >> m;
for(i = 1; i <= n; i ++){
cin >> a;
update(i, a);
}
for(i = 1; i <= m; i ++){
cin >> op >> a;
if(op == 0){
cin >> b;
update(a, b);
}
else if(op == 1){
cin >> b;
cout << query(b) - query(a - 1) << "\n";
}
else if(op == 2){
int st = 1;
int dr = n;
int med;
while(st <= dr && query(med) != a){
med = (st + dr) / 2;
int x = query(med);
if(x < a){
st = med + 1;
}
else if(x > a){
dr = med - 1;
}
else if(x == a){
break;
}
}
if(query(med) != a){
cout << -1 << "\n";
}
else {
cout << med << "\n";
}
}
}
return 0;
}