Pagini recente » Cod sursa (job #2189854) | Cod sursa (job #2100441) | Cod sursa (job #2214807) | Cod sursa (job #1331817) | Cod sursa (job #2231653)
#include <cstdio>
#define lsb(x) (x & (-x))
FILE *fin = freopen("aib.in","r",stdin); FILE *fout = freopen("aib.out","w",stdout);
const int nmax = 100000 + 5;
/* -------- Data --------*/
int n, m;
int aib[nmax];
/* -------- Data --------*/
void Update(int position, int value)
{
for(int i = position; i <= n; i+= lsb(i))
{
aib[i] += value;
}
}
int Query(int position)
{
int result = 0;
for(int i =position; i> 0 ; i-=lsb(i))
{
result+=aib[i];
}
return result;
}
void ReadInput()
{
int x, op, a,b;
scanf("%d%d",&n,&m);
for(int i= 1; i<= n; i++)
{
scanf("%d",&x);
Update(i,x);
}
for(int i =1; i<= m; i++)
{
scanf("%d",&op);
if(op==0)
{
scanf("%d%d",&a,&b);
Update(a,b);
}
else if(op==1)
{
scanf("%d%d",&a,&b);
printf("%d\n",Query(b) - Query(a-1));
}
else
{
int pas=1,k=0;
scanf("%d",&a);
for(;pas<=n;pas<<=1);
for(; pas ; pas >>= 1)
{
if(k+pas <= n && Query(k+pas)<=a)
k+=pas;
}
if(Query(k)==a)
printf("%d\n",k);
else
printf("-1\n");
}
}
}
int main()
{
ReadInput();
}