Pagini recente » Cod sursa (job #449196) | Cod sursa (job #1937212) | Cod sursa (job #999792) | Cod sursa (job #767387) | Cod sursa (job #2642913)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
const int NMAX = 100'001;
int n, queries, tree[NMAX];
void make() {
for(int i = 1;i <= n;++i) {
int parent = i + (i & -i);
if(parent <= n)
tree[parent] += tree[i];
}
}
void update(int index, const int& value) {
while(index <= n) {
tree[index] += value;
index += (index & -index);
}
}
int sum(int i) {
int s = 0;
while(i > 0) {
s += tree[i];
i -= (i & -i);
}
return s;
}
int query2(int a) {
int left = 1;
int right = n;
while(left <= right) {
int mid = (left + right) / 2;
int s = sum(mid);
if(s == a)
return mid;
if(s < a)
left = mid + 1;
else
right = mid - 1;
}
return -1;
}
int main() {
f >> n >> queries;
for(int i = 1;i <= n;++i)
f >> tree[i];
make();
while(queries--) {
int type, a, b;
f >> type;
if(type == 0) {
f >> a >> b;
update(a, b);
}else if(type == 1) {
f >> a >> b;
if(a > b)
swap(a, b);
g << sum(b) - sum(a - 1) << '\n';
}else {
f >> a;
g << query2(a) << '\n';
}
}
return 0;
}