Pagini recente » Cod sursa (job #2299019) | Cod sursa (job #3161644) | Cod sursa (job #3153500) | Cod sursa (job #2609944) | Cod sursa (job #3245984)
#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 sum){
int maxp = getPower(sum), pos = 0;
for(int interval = maxp; interval; interval >>= 1){
if(pos + interval <= n && v[pos + interval] < sum){
sum -= v[pos + interval];
pos += interval;
}
}
return (v[pos + 1] == sum ? pos + 1 : -1);
}
};
aib fen;
int main()
{
ifstream cin("asdf.in");
ofstream cout("asdf.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;
}