Pagini recente » Cod sursa (job #193832) | Cod sursa (job #1657178) | Cod sursa (job #2300872) | Cod sursa (job #168054) | Cod sursa (job #2292287)
#include <bits/stdc++.h>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int DIM = 1e5 + 17;
int aib[DIM];
int n;
void update(int pos, int val)
{
for(int i = pos; i <= n; i += i & (-i))
aib[i] += val;
}
int get_sum(int pos)
{
int s = 0;
for(int i = pos; i >= 1; i -= i & (-i))
s += aib[i];
return s;
}
int main()
{
int m;
in >> n >> m;
for(int i = 1; i <= n; i++)
{
int x;
in >> x;
update(i, x);
}
while(m--)
{
int op;
in >> op;
if(op == 0)
{
int pos, val;
in >> pos >> val;
update(pos, val);
}
else
if(op == 1)
{
int l, r;
in >> l >> r;
out << get_sum(r) - get_sum(l - 1) << '\n';
}
else
{
int sum;
in >> sum;
int l = 1;
int r = n;
int pos = -1;
while(l <= r)
{
int mid = (l + r) / 2;
int p = get_sum(mid);
if(p >= sum)
{
if(p == sum)
pos = mid;
r = mid - 1;
}
else
{
l = mid + 1;
}
}
out << pos << '\n';
}
}
}