Pagini recente » Cod sursa (job #1042532) | Cod sursa (job #118209) | Cod sursa (job #998369) | Cod sursa (job #2432245) | Cod sursa (job #429891)
Cod sursa(job #429891)
#include <iostream>
#define IN "aib.in"
#define OUT "aib.out"
#define zeroz(x) ((x^(x-1))&x)
#define Lg 100100
using namespace std;
int arb[Lg], N, M;
void add(int inc,int val)
{
for(;inc<=N;inc+=zeroz(inc))
arb[inc]+=val;
}
void citire()
{
int val;
scanf("%d %d",&N,&M);
for(int i=1;i<=N;i++)
{
cin>>val;
add(i,val);
}
}
int suma(int a)
{
int s=0;
for(int i=a;i>0;i-=zeroz(i))
s+=arb[i];
return s;
}
int poz(int a)
{
int i,p;
for (p=1; p<N; p<<=1);
for(i=0; p; p>>=1)
if(i+p<=N)
if(a>=arb[p+i])
{
a-=arb[p+i];
i+=p;
if(!a)
return i;
}
return -1;
}
void solve()
{
int op,a,b;
for(int i=1;i<=M;i++)
{
scanf("%d",&op);
if(op==0)
{
scanf("%d %d",&a,&b);
add(a,b);
}
else if(op==1)
{
scanf("%d %d",&a,&b);
printf("%d\n",suma(b)-suma(a-1));
}
else if(op==2)
{
scanf("%d",&a);
printf("%d\n",poz(a));
}
}
}
int main ()
{
freopen (IN,"r",stdin);
freopen (OUT,"w",stdout);
citire();
solve();
return 0;
}