Pagini recente » Cod sursa (job #2084997) | Cod sursa (job #246970) | Cod sursa (job #310869) | Cod sursa (job #240261) | Cod sursa (job #1199295)
#include <iostream>
#include <cstdio>
#include <algorithm>
#define Nmax 100005
using namespace std;
int n, m, aib[Nmax];
inline int _2lanr0(int x)
{
return x&(x^(x-1));
}
void adaugare(int p, int x)
{
while (p<=n)
{
aib[p]+=x;
p+=_2lanr0(p);
}
}
void Citire()
{
int i, x;
scanf("%d %d", &n, &m);
for (i=1; i<=n; i++)
{
scanf("%d", &x);
adaugare(i, x);
}
}
int suma(int p)
{
int sum=0;
while (p>0)
{
sum+=aib[p];
p-=_2lanr0(p);
}
return sum;
}
int caut_bin(int x)
{
int st=1, dr=n, m, ss;
while (st!=dr)
{
m=(st+dr)/2;
ss=suma(m);
if (ss>=x)
dr=m;
else
st=m+1;
}
if (x==suma(st))
return st;
return -1;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int i, x, q, w;
Citire();
for (i=1; i<=m; i++)
{
scanf("%d", &x);
if (x==0)
{
scanf("%d %d", &q, &w);
adaugare(q, w);
}
else if (x==1)
{
scanf("%d %d", &q, &w);
printf("%d\n", suma(w)-suma(q-1));
}
else if (x==2)
{
scanf("%d", &q);
printf("%d\n", caut_bin(q));
}
}
return 0;
}