Pagini recente » Cod sursa (job #2661463) | Cod sursa (job #1388921) | Cod sursa (job #3158180) | Cod sursa (job #651110) | Cod sursa (job #2377788)
#include <bits/stdc++.h>
#define NMAX 100009
#define zeros(x) ( (x ^ (x - 1)) & x )
#define in "aib.in"
#define out "aib.out"
using namespace std;
int arb[NMAX];
int N,M,i,val,test;
int x,y;
void adaug(int x, int quantity);
int cautbin(int x);
int sum(int x);
int main()
{ freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d%d", &N, &M);
for(i=1;i<=N;i++)
{
scanf("%d", &val);
adaug(i,val);
}
for(;M;M--)
{
scanf("%d",&test);
if(test<2)
{
scanf("%d",&x,&y);
if(!test) ///adaug
adaug(x,y);
else
printf("%d\n",sum(y)-sum(x-1));
}
else ///caut binar pe sume valoarea
{
scanf("%d",&x);
printf("%d\n",cautbin(x));
}
}
return 0;
}
void adaug(int x, int quantity)
{
int i;
for (i = x; i <= N; i += zeros(i))
arb[i] += quantity;
}
int sum(int x)
{
int i, ret = 0;
for (i = x; i > 0; i -= zeros(i))
ret += arb[i];
return ret;
}
int cautbin(int x)
{
int poz=N+1,mj;
int st=0,dr=N+1,suma;
mj=N;
suma=sum(mj);
if(suma==x) poz=N;
while(mj)
{
mj=(st+dr)/2;
suma=sum(mj);
if(x>suma)
{if(dr>mj) dr=mj;mj--;}
else
{if(st<mj) st=mj;mj++;}
if(mj<=st) break;
if(mj>=dr) break;
}
if(poz==N+1) return -1;
return poz;
}