Pagini recente » Cod sursa (job #578522) | Cod sursa (job #2557440) | Cod sursa (job #2264691) | Cod sursa (job #2856260) | Cod sursa (job #320685)
Cod sursa(job #320685)
#include<stdio.h>
#include<vector>
using namespace std;
#define nmax 100010
int min(int,int);
void update(int,int);
int query(int);
int search(int);
int n,m,arb[nmax];
int main()
{
int i,k,x,y;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d",&n,&m);
memset(arb,0,sizeof(arb));
for(i=1;i<=n;i++)
{
scanf("%d",&x);
update(i,x);
}
for(i=1;i<=m;i++)
{
scanf("%d",&k);
if(k<2)
{
scanf("%d %d",&x,&y);
if(!k)
update(x,y);
else
printf("%d\n",query(y)-query(x-1));
}
else
{
scanf("%d",&x);
printf("%d\n",search(x));
}
}
return 0;
}
int min(int a,int b)
{
if(a<b)
return a;
else
return b;
}
void update(int i,int x)
{
int c=0;
while(i<=n)
{
arb[i]=arb[i]+x;
while(!(i&(1<<c)))c++;
i=i+(1<<c);
c++;
}
}
int search(int x)
{
int i,j;
for(j=1;j<n;j<<=1);
for(i=0;j;j>>=1)
{
if(i+j<=n)
{
if(x>=arb[i+j])
{
i=i+j;
x=x-arb[i];
if(!x)
return i;
}
}
}
return -1;
}
int query(int i)
{
int c=0,s=0;
while(i>0)
{
s=s+arb[i];
while(!(i&(1<<c)))c++;
i=i-(1<<c);
c++;
}
return s;
}