Pagini recente » Cod sursa (job #355218) | Cod sursa (job #104331) | Cod sursa (job #3149666) | Cod sursa (job #1007795) | Cod sursa (job #1952376)
#include <bits/stdc++.h>
#define zeros(x) ((x^(x-1))&x)
using namespace std;
int v[100004], n;
void update(int pos, int val)
{
for(int i = pos; i <= n; i += zeros(i))
v[i] += val;
}
int query(int pos)
{
int rez = 0;
for(int i = pos; i > 0; i -= zeros(i))
rez += v[i];
return rez;
}
int cb(int val)
{
int st = 1, dr = n, mij;
while(st < dr)
{
mij = (st + dr) / 2;
if(val >= query(mij))
st = mij + 1;
else dr = mij;
}
mij = (st + dr) / 2;
if(query(mij) > val)
mij--;
if(query(mij) != val)
return -1;
return mij;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int c, a, b, m;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
{
scanf("%d", &a);
update(i, a);
}
while(m--)
{
scanf("%d", &c);
if(c == 0)
{
scanf("%d%d", &a, &b);
update(a, b);
}
else if(c == 1)
{
scanf("%d%d", &a, &b);
printf("%d\n", query(b) - query(a - 1));
}
else
{
scanf("%d", &a);
printf("%d\n", cb(a));
}
}
return 0;
}