Pagini recente » Cod sursa (job #373441) | Cod sursa (job #1590824) | Cod sursa (job #3242000) | Cod sursa (job #1030693) | Cod sursa (job #2999543)
#include <cstdio>
using namespace std;
int aib[100001], n;
int thing(int x)
{
/// example
/// x = b101100100
/// x-1= b101100011 = y
/// x^y= b000000111 = z
/// z&x= b000000100
return (x ^ (x - 1)) & x;
}
void Add(int pos, int val)
{
for (int i = pos; i <= n; i += thing(i))
aib[i] += val;
}
int Query(int pos)
{
int x = 0;
for (int i = pos; i > 0; i -= thing(i))
x += aib[i];
return x;
}
int Query2(int a)
{
for (int i=1; i<=n; i++)
{
int q = Query(i);
if (q == a) return i;
if (q > a) return -1;
}
return -1;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int m;
scanf("%d%d", &n, &m);
for (int i=1; i<=n; i++)
{
int a;
scanf("%d",&a);
Add(i, a);
}
for (int i=1; i<=m; i++)
{
int x,a,b=0;
scanf("%d%d",&x,&a);
if (x != 2) scanf("%d",&b);
if(x==0) Add(a,b);
if(x==1) printf("%d\n", Query(b) - Query(a - 1));
if(x==2) printf("%d\n", Query2(a));
}
return 0;
}