Pagini recente » Cod sursa (job #2901843) | Cod sursa (job #2448814) | Cod sursa (job #1177856) | Cod sursa (job #1750885) | Cod sursa (job #1767536)
#include <stdio.h>
#include <stdlib.h>
#define zero(x) ((x^(x-1))&x)
int n,m,s[100010];
void citire();
void rezolvare();
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
citire();
rezolvare();
return 0;
}
void citire()
{
scanf("%d %d ",&n,&m);
int i;
for(i=1;i<=n;i++)
{
int val;
scanf("%d ",&val);
int j;
for(j=i;j<=n;j+=zero(j))
s[j]+=val;
}
}
void adauga(int p1,int p2)
{
int i;
for(i=p1;i<=n;i+=zero(i))
s[i]+=p2;
}
int suma(int x)
{
int t=0,i;
for(i=x;i>=1;i-=zero(i))
t+=s[i];
return t;
}
int interog(int p1,int p2)
{
return suma(p2)-suma(p1-1);
}
int cautare(int p)
{
int st=1,dr=n;
while(st<=dr)
{
int m=(st+dr)/2;
int sum=suma(m);
if(sum==p)
return m;
if(sum>p)
dr=m-1;
else
st=m+1;
}
return -1;
}
void rezolvare()
{
int i;
for(i=1;i<=m;i++)
{
int op,param1,param2;
scanf("%d ",&op);
if(!op)
{
scanf("%d %d ",¶m1,¶m2);
adauga(param1,param2);
}
else if(op==1)
{
scanf("%d %d ",¶m1,¶m2);
printf("%d\n",interog(param1,param2));
}
else if(op==2)
{
scanf("%d ",¶m1);
printf("%d\n",cautare(param1));
}
}
}