Pagini recente » Cod sursa (job #2712861) | Cod sursa (job #23288) | Cod sursa (job #1583942) | Cod sursa (job #2438827) | Cod sursa (job #1182634)
#include<cstdio>
#define LSB(x) ((-x)&x)
using namespace std;
int AIB[100001],n,m;
void UpDate(int x,int val)
{
for (int i=x;i<=n;i+=LSB(i))
{
AIB[i]+=val;
}
}
int Sum(int x)
{
int s=0;
for (int i=x;i>0;i-=LSB(i))
s+=AIB[i];
return s;
}
int caut(int x)
{
int st=1,dr=n,mij;
while (dr-st>1)
{
mij=(dr+st)/2;
if (Sum(mij)>=x) dr=mij;
else st=mij;
}
return Sum(st)==x ? st : Sum(dr)==x ? dr : -1;
}
int main()
{
int i,op,x,y;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=n;++i)
{
scanf("%d",&x);
UpDate(i,x);
}
for (i=1;i<=m;++i)
{
scanf("%d",&op);
if (op==0)
{
scanf("%d%d",&x,&y);
UpDate(x,y);
}
else if (op==1)
{
scanf("%d%d",&x,&y);
printf("%d\n",Sum(y)-Sum(x-1));
}
else
{
scanf("%d",&x);
printf("%d\n",caut(x));
}
}
return 0;
}