Pagini recente » Profil MrPetcu | Istoria paginii utilizator/maricasorin | Istoria paginii utilizator/ralucaanton | Statistici Rusnac Mihai (MihaiMrDawa) | Cod sursa (job #611946)
Cod sursa(job #611946)
#include<stdio.h>
int a[100100];
inline int zero(int x)
{
if(x==0)
return 0;
int t=0;
while(x%2==0)
{
x>>=1;
t++;
}
return t;
}
int sum(int x)
{
int t=0;
while(x)
{
t+=a[x];
x-=1<<zero(x);
}
return t;
}
int bs(int x,int dr)
{
int st=1,mid=0,last=-1,y;
while(st<=dr)
{
mid=st+((dr-st)>>1);
y=sum(mid);
if(x==y)
{
last=mid;
dr=mid-1;
}
if(x<y)
dr=mid-1;
if(x>y)
st=mid+1;
}
return last;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int n,m,i,x,j,t,y,sum1,sum2;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
j=i;
while(j<=n)
{
a[j]+=x;
j+=1<<zero(j);
}
}
for(i=1;i<=m;i++)
{
scanf("%d",&t);
if(t==0)
{
scanf("%d%d",&x,&y);
j=x;
while(j<=n)
{
a[j]+=y;
j+=1<<zero(j);
}
}
if(t==1)
{
scanf("%d%d",&x,&y);
sum1=sum2=0;
x--;
j=x;
while(j)
{
sum1+=a[j];
j-=1<<zero(j);
}
j=y;
while(j)
{
sum2+=a[j];
j-=1<<zero(j);
}
printf("%d\n",sum2-sum1);
}
if(t==2)
{
scanf("%d",&x);
printf("%d\n",bs(x,n));
}
}
return 0;
}