Pagini recente » Cod sursa (job #1691948) | Cod sursa (job #2118845) | Cod sursa (job #495974) | Cod sursa (job #2155579) | Cod sursa (job #1552083)
/*
Arbori indexati binar
*/
#include <iostream>
#include <stdio.h>
#include <cstdio>
#define NMax 100050
using namespace std;
int N,M,AIB[NMax];
inline int zeros(int x)
{
return (x^(x-1))&x;
}
void Update(int x,int val)
{
for(int i=x;i<=N;i=i+zeros(i))
AIB[i]=AIB[i]+val;
}
int Suma(int x)
{
int suma=0;
for(int i=x;i>=1;i=i-zeros(i))
suma=suma+AIB[i];
return suma;
}
int search(int value)
{
int step,vals=0, ind = 0;
for(step=1;step<N;step<<=1);
for(step;step;step>>=1)
if (ind+step<=N && vals+AIB[ind+step]<=value)
vals += AIB[ind+=step];
return ind;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d%d",&N,&M);
for (int i=1;i<=N;i++)
{
int x;
scanf("%d",&x);
Update(i,x);
}
for(int i=1;i<=M;i++)
{
int x,y,z;
scanf("%d",&x);
if (x==0)
{
scanf("%d %d",&y,&z);
Update(y,z);
}
else if(x==1)
{
scanf("%d %d",&x,&y);
printf("%d\n",Suma(y)-Suma(x-1));
}
else if (x==2)
{
scanf("%d",&y);
int ind=search(y);
if (ind>=1 && ind<=N && Suma(ind)==y)
printf("%d\n",ind);
else
printf("-1\n");
}
}
}