Pagini recente » Cod sursa (job #2491498) | Cod sursa (job #1650371) | Cod sursa (job #1101192) | Cod sursa (job #795637) | Cod sursa (job #1648130)
#include <iostream>
#include <fstream>
#define zeros(x) ((x^(x-1))&x)
using namespace std;
const int NMAX = 100001;
int AIB[NMAX];
int n,m;
void Add(int,int);
void citire()
{
scanf("%d %d",&n,&m);
int x;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
Add(i,x);
}
}
void Add(int x,int val)
{
for(int i=x;i<=n;i+=zeros(i))
AIB[i]+=val;
}
int Sum(int x)
{
int sum = 0;
for(int i=x;i>0;i-=zeros(i))
sum+=AIB[i];
return sum;
}
int binar(int a)
{
int x = 1,y=n;
int m;
while(x<=y)
{
m = (x+y)/2;
if(Sum(m)==a && Sum(m-1) < a)
return m;
else
{
if(Sum(m)>=a)
y = m-1;
else
x = m+1;
}
}
return -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
citire();
int q,a,b;
for(int i=1;i<=m;i++)
{
scanf("%d",&q);
if(q==0)
{
scanf("%d %d",&a,&b);
Add(a,b);
continue;
}
if(q==1)
{
scanf("%d %d",&a,&b);
printf("%d\n",Sum(b)-Sum(a-1));
continue;
}
if(q==2)
{
scanf("%d",&a);
printf("%d\n",binar(a));
continue;
}
}
fclose(stdin);
fclose(stdout);
return 0;
}