Pagini recente » Cod sursa (job #2467587) | Cod sursa (job #2722953) | Cod sursa (job #1312465) | Cod sursa (job #2987886) | Cod sursa (job #386298)
Cod sursa(job #386298)
#include<iostream>
#include<string>
using namespace std;
#define NM 100005
#define FOR(i,a,b)for(int i=(a);i<=(b);++i)
#define lsb(x)(((x)^(x-1))&(x))
int N,M;
int AIB[NM];
inline void update(int poz,int val)
{
while(poz<=N)
{
AIB[poz]+=val;
poz+=lsb(poz);
}
}
inline int query(int poz)
{
int ans=0;
while(poz)
{
ans+=AIB[poz];
poz-=lsb(poz);
}
return ans;
}
int main()
{
int val,a,b,op;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d",&N,&M);
FOR(i,1,N)
{
scanf("%d",&val);
update(i,val);
}
FOR(i,1,M)
{
scanf("%d",&op);
if(op==0)
{
scanf("%d %d",&a,&b);
update(a,b);
}
if(op==1)
{
scanf("%d %d",&a,&b);
int ans=query(b)-query(a-1);
printf("%d\n",ans);
}
if(op==2)
{
scanf("%d",&a);
int st=1;int dr=N;
while(st<dr)
{
int mij=(st+dr)/2;
if(query(mij)>=a) dr=mij;
else st=mij+1;
}
if(query(st)==a) printf("%d\n",st);
else printf("-1\n");
}
}
return 0;
}