Pagini recente » Cod sursa (job #452066) | Istoria paginii runda/concurnfo | Cod sursa (job #2134438) | Cod sursa (job #1274196) | Cod sursa (job #2281470)
#include "bits/stdc++.h"
using namespace std;
#define ll long long
static const int maxn = 1e5 + 5;
ll tree[maxn];
int n, q;
inline void update(int pos, ll val)
{
while (pos <= n)
{
tree[pos] += val;
pos += pos & -pos;
}
}
inline ll read(int pos)
{
ll sum = 0;
while (pos > 0)
{
sum += tree[pos];
pos -= pos & -pos;
}
return sum;
}
inline ll query(int l, int r)
{
return read(r) - read(l-1);
}
inline int getK(ll k)
{
int low = 1;
int high = n;
int ans = -1;
while (low <= high)
{
int mid = (low + high) >> 1;
ll sum = read(mid);
if (sum == k) ans = mid, high = mid - 1;
else if (sum < k) low = mid + 1;
else high = mid - 1;
}
return ans;
}
int main()
{
freopen(in, "r", stdin);
freopen(out, "w", stdout);
scanf("%d %d", &n, &q);
for (int i = 1; i <= n; i++)
{
ll x;
scanf("%lld", &x);
update(i, x);
}
while (q--)
{
int type;
scanf("%d", &type);
if (type == 0)
{
int pos;
ll val;
scanf("%d %lld", &pos, &val);
update(pos, val);
}
else if (type == 1)
{
int l, r;
scanf("%d %d", &l, &r);
ll sum = query(l, r);
printf("%lld\n", sum);
}
else
{
ll k;
scanf("%lld", &k);
int min_index = getK(k);
printf("%d\n", min_index);
}
}
}