Pagini recente » Cod sursa (job #426375) | Cod sursa (job #3263608) | Cod sursa (job #35098) | Cod sursa (job #1519212) | Cod sursa (job #1384367)
#include<vector>
#include<algorithm>
#include<fstream>
#include<iostream>
using namespace std;
int bit[100005];
int N,M;
int lsb(int x) {
return x & -x;
}
void update(int pos, int el) {
for(; pos <= N; pos += lsb(pos)) {
bit[pos] += el;
}
}
int query(int pos) {
int sum = 0;
for(; pos > 0; pos -= lsb(pos)) {
sum += bit[pos];
}
return sum;
}
int binary_search(int el) {
int hi = N, lo = 1;
while(lo <= hi) {
int mid = lo + (hi-lo)/2;
if(query(mid) == el) {
return mid;
}
else if(query(mid) > el) {
hi = mid - 1;
}
else {
lo = mid + 1;
}
}
return -1;
}
int main() {
ifstream fin ("aib.in");
ofstream fout("aib.out");
fin >> N >> M;
for(int i = 1; i <= N; ++i) {
int x; fin >> x;
update(i, x);
}
for(int i = 1; i <= M; ++i) {
int x; fin >> x;
switch(x) {
case 0:
int pos, el; fin >> pos >> el;
update(pos, el);
break;
case 1:
int start, end; fin >> start >> end;
fout << query(end) - query(start - 1) << '\n';
break;
case 2:
int s; fin >> s;
fout << binary_search(s) << '\n';
break;
default:
break;
}
}
return 0;
}