Pagini recente » Cod sursa (job #111708) | Cod sursa (job #2864175) | Cod sursa (job #516756) | Cod sursa (job #2374033) | Cod sursa (job #609148)
Cod sursa(job #609148)
#include<stdio.h>
#define maxn 100005
#define zeros(x) ( (x ^ (x - 1)) & x )
int AIB[maxn];
int N,M,op,rez=-1;
void Update(int x,int val)
{
for(int i=x;i<=N;i+=zeros(i))
AIB[i]+=val;
}
int Query(int x)
{
int sum=0;
for(int i=x;i>0;i-=zeros(i))
sum+=AIB[i];
return sum;
}
void Search(int st,int dr,int x)
{
if(st==dr-1)
{
if(Query(st)==x) rez=st;
else if(Query(dr)==x) rez=dr;
else rez=-1;
return;
}
int val;
val=Query((st+dr)/2);
if(val==x) {rez=((st+dr)/2);return;}
else if(val>x) Search(st,(st+dr)/2,x);
else if(val<x) Search((st+dr)/2,dr,x);
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int x,a,b;
scanf("%d %d",&N,&M);
for(int i=1;i<=N;i++)
{
scanf("%d",&x);
Update(i,x);
}
for(int i=1;i<=M;i++)
{
scanf("%d",&op);
if(op==0)
{
scanf("%d %d",&a,&b);
Update(a,b);
}
if(op==1)
{
scanf("%d %d",&a,&b);
printf("%d\n",Query(b)-Query(a-1));
}
if(op==2)
{
scanf("%d\n",&a);
Search(1,N,a);
printf("%d\n",rez);
rez=-1;
}
}
}