Pagini recente » Cod sursa (job #2322295) | Cod sursa (job #1733330) | Cod sursa (job #2309851) | Cod sursa (job #2431248) | Cod sursa (job #3149303)
#include <fstream>
using namespace std;
#define lung(x) ( (x ^(x - 1)) & x )
ifstream cin("aib.in");
ofstream cout("aib.out");
int N, M, aib[100100];
void update(int poz, int val) {
for (int i = poz; i <= N + 1; i += lung(i))
aib[i] += val;
}
int query(int poz) {
int s = 0;
for (int i = poz; i >= 1; i -= lung(i))
s += aib[i];
return s;
}
int search(int a) {
int st = 1, dr = N, mid, sol = -1;
while (st <= dr) {
mid = (st + dr) / 2;
if (query(mid) == a) {
sol = mid;
dr = mid - 1;
}
else if (query(mid) < a)
st = mid + 1;
else
dr = mid - 1;
}
return sol;
}
int main() {
cin >> N >> M;
//citire elemente
for (int i = 1; i <= N; i++) {
int x;
cin >> x;
update(i, x);
}
int a, b, x;
for (int i = 1; i <= M; i++) {
cin >> x;
if (x != 2) {
cin >> a >> b;
if (x == 0)
update(a, b);
else if (x == 1)
cout << query(b) - query(a) - 1 << '\n';
}
else {
cin >> a;
cout << search(a) << '\n';
}
}
return 0;
}