Pagini recente » Cod sursa (job #2915266) | Cod sursa (job #176194) | Cod sursa (job #769394) | Cod sursa (job #40065) | Cod sursa (job #1162084)
#include <cstdio>
#define Nmax 100005
using namespace std;
int N,aib[Nmax];
inline void Update(int x, int y)
{
for(int i=x;i<=N;i+=(i&(-i)))
aib[i]+=y;
}
inline int Query(int x)
{
int s=0;
for(int i=x;i>0;i-=(i&(-i)))
s+=aib[i];
return s;
}
inline int BSearch(int x)
{
int st=1,dr=N,mij,sol=-1,val;
while(st<=dr)
{
mij=((st+dr)>>1);
val=Query(mij);
if(val>=x)
{
if(val==x)
sol=mij;
dr=mij-1;
}
else
st=mij+1;
}
return sol;
}
int main()
{
int i,M,x,y,tip;
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);
}
while(M--)
{
scanf("%d%d", &tip,&x);
if(!tip)
{
scanf("%d", &y);
Update(x,y);
}
else
if(tip==1)
{
scanf("%d", &y);
printf("%d\n", Query(y)-Query(x-1));
}
else
printf("%d\n", BSearch(x));
}
return 0;
}