Pagini recente » Cod sursa (job #1767500) | Cod sursa (job #465628) | Cod sursa (job #2826430) | Cod sursa (job #1353892) | Cod sursa (job #3246128)
#include <iostream>
#include <fstream>
using namespace std;
int getPower(int n){
int p;
for(p = 1; p <= n; p <<= 1){}
return (p >> 1);
}
struct aib{
int n, v[10000001];
void init(int n){
this->n = n;
}
void add(int pos, int x){
while(pos <= n){
v[pos] += x;
pos += pos & -pos;
}
}
int sum(int pos){
int rez = 0;
while(pos){
rez += v[pos];
pos &= pos - 1;
}
return rez;
}
int rangeSum(int x, int y){
return sum(y) - sum(x - 1);
}
int binSearch(int s){
int st = 1, dr = n;
while(st <= dr){
int mij = (st + dr) >> 1;
if(sum(mij) < s)
st = mij + 1;
else
dr = mij - 1;
}
return (sum(st) == s ? st : -1);
}
};
aib fen;
int main()
{
ifstream cin("aib.in");
ofstream cout("aib.out");
int n, q, t, x, y;
cin >> n >> q;
fen.init(n);
for(int i = 1; i <= n; i++){
cin >> x;
fen.add(i, x);
}
for(int i = 1; i <= q; i++){
cin >> t >> x;
if(t == 0)
cin >> y, fen.add(x, y);
else
if(t == 1)
cin >> y, cout << fen.rangeSum(x, y) << "\n";
else
cout << fen.binSearch(x) << "\n";
}
return 0;
}