Pagini recente » Cod sursa (job #3160445) | Cod sursa (job #1781748) | Cod sursa (job #1228792) | Cod sursa (job #1514551) | Cod sursa (job #3194818)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define N_MAX 100000
#define int long long
int v[N_MAX], aib[N_MAX];
int n;
int query(int x) {
int sum = 0;
while(x > 0) {
sum += aib[x];
x -= (x & (-x));
}
return sum;
}
int update(int x, int val) {
while(x <= n) {
aib[x] += val;
x += (x & (-x));
}
}
int findVal(int val) {
int st, dr, mid, sum, res;
st = 1;
dr = n;
res = -1;
while(st <= dr) {
mid = (st + dr) / 2;
sum = query(mid);
if(sum == val) {
res = mid;
}
if(sum > val) {
dr = mid - 1;
}else{
st = mid + 1;
}
}
return res;
}
signed main()
{
int m, i, q, a, b;
fin >> n >> m;
for(i = 1; i <= n; ++i) {
fin >> v[i];
update(i, v[i]);
}
for(i = 0; i < m; ++i) {
fin >> q >> a;
if(q <= 1) {
fin >> b;
}
if(q == 0) {
update(a, b);
}else if(q == 1) {
fout << query(b) - query(a - 1) << '\n';
}else{
fout << findVal(a) << '\n';
}
}
return 0;
}