Pagini recente » Cod sursa (job #131374) | Cod sursa (job #847614) | Cod sursa (job #104059) | Cod sursa (job #2260971) | Cod sursa (job #2890748)
#include <bits/stdc++.h>
#define lsb(x) (x&(-x))
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int v[100005], aib[100005];
int n, m;
void update(int pos, int val) {
while(pos <= n) {
aib[pos] += val;
pos += lsb(pos);
}
}
int query(int pos) {
int rez = 0;
while(pos >= 1) {
rez += aib[pos];
pos -= lsb(pos);
}
return rez;
}
int main() {
fin >> n >> m;
for(int i = 1; i <= n; i++) {
fin >> v[i];
update(i, v[i]);
}
for(int i = 1; i <= m; i++) {
int q; fin >> q;
if(q == 0) {
int poz, val; fin >> poz >> val;
update(poz, val);
}
if(q == 1) {
int a, b; fin >> a >> b;
fout << query(b) - query(a-1) << "\n";
}
if(q == 2) {
int a; fin >> a;
int st = 1;
int dr = n;
int poz = 0;
while(st <= dr) {
int mid = (st+dr) / 2;
int qq = query(mid);
if(qq == a) {
poz = mid;
dr = mid - 1;
} else {
if(qq > a) {
dr = mid - 1;
} else {
st = mid + 1;
}
}
}
if(poz != 0) {
fout << poz << "\n";
} else {
fout << -1 << "\n";
}
}
}
return 0;
}