Pagini recente » Cod sursa (job #1633771) | Cod sursa (job #1933735) | Cod sursa (job #225625) | Cod sursa (job #2424632) | Cod sursa (job #1603974)
#include <cstdio>
#define NMax 100005
#define zerouri(x) ((x^(x-1))&x)
using namespace std;
int N, M, v[NMax], i, tip, a , b, x;
void Adauga(int x, int val)
{
for(int i=x; i<=N; i+=zerouri(i))
v[i]+=val;
}
int Interog (int x)
{
int ans=0;
for(int i=x; i>0; i-=zerouri(i))
ans+=v[i];
return ans;
}
int Cauta (int val)
{
int st=1, dr=N, m=(st+dr)/2;
int suma=Interog(m);
while(suma!=val&&st<=dr)
{
if(suma>val)
dr=m-1;
else if (suma<val) st=m+1;
m=(st+dr)/2;
suma=Interog(m);
}
if(st>dr) return -1;
return m;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d",&N,&M);
for(i=1;i<=N;i++)
{
scanf("%d",&x);
Adauga(i,x);
}
for(i=1;i<=M;i++)
{
scanf("%d",&tip);
if(tip<2)
{
scanf("%d %d",&a,&b);
if(tip==0) Adauga(a,b);
else printf("%d\n",Interog(b)-Interog(a-1));
}
else
{
scanf("%d",&a);
printf("%d\n",Cauta(a));
}
}
return 0;
}