Pagini recente » Cod sursa (job #2876925) | Cod sursa (job #2837785) | Cod sursa (job #1410643) | Cod sursa (job #3133478) | Cod sursa (job #1141435)
#include <cstdio>
#define bit(x) (x&(-x))
using namespace std;
int n,m,x,y,i,j,a[100006],k,k1;
int query(int p)
{
int i,k=0;
for(i=p; i>0; i-=bit(i))
k+=a[i];
return k;
}
void update(int k, int x)
{
int i;
for(i=k; i<=n; i+=bit(i))
a[i]+=x;
}
int bs(int x)
{
int st,dr,m,k;
st=1; dr=n;
while(st<=dr)
{
m=(st+dr)/2;
k=query(m);
if(k==x) return m;
if(k<x) st=m+1;
else dr=m-1;
}
return -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d\n", &n, &m);
for(i=1; i<=n; ++i)
{
scanf("%d ",&x);
update(i,x);
}
for(i=1; i<=m; ++i)
{
scanf("%d ",&k);
if(k==0)
{
scanf("%d %d\n",&k1,&x);
update(k1,x);
}
if(k==1)
{
scanf("%d %d\n",&x,&y);
printf("%d\n",query(y)-query(x-1));
}
if(k==2)
{
scanf("%d\n",&x);
printf("%d\n",bs(x));
}
}
return 0;
}