Pagini recente » Cod sursa (job #1997879) | Cod sursa (job #756849) | Cod sursa (job #1250627) | Cod sursa (job #2337624) | Cod sursa (job #1097963)
#include <cstdio>
#define LSB(x) ((-x)&x)
using namespace std;
int x,N,M,i,aib[100005],t,a,b;
void Update(int V,int Pos)
{
int i;
for(i=Pos;i<=N;i=i+LSB(i))
aib[i]=aib[i]-V;
}
void Update1(int V,int Pos)
{
int i;
for(i=Pos;i<=N;i=i+LSB(i))
aib[i]=aib[i]+V;
}
int Suma(int Pos)
{
int i,s=0;
for(i=Pos; i>0; i-=LSB(i))
s=s+aib[i];
return s;
}
int query(int P1,int P2)
{
return (Suma(P2)-Suma(P1-1));
}
int verific_binar(int a)
{
int m,p,u;
p=1;
u=N;
while (p<=u)
{
m=(p+u)/2;
if (Suma(m)==a) return m;
else
if (Suma(m)<a)
{
if (Suma(m+1)>a) return -1;
else
p=m+1;
}
else
{
if(Suma(m-1)<a) return -1;
else u=m-1;
}
}
return -1;
}
int main()
{
freopen("datorii.in","r",stdin);
freopen("datorii.out","w",stdout);
scanf("%d%d",&N,&M);
for( i = 1; i <= N; i++ )
{
scanf("%d",&x);
Update1(x,i);
}
while(M>0)
{
M--;
scanf("%d",&t);
if ( t==0 )
{
scanf("%d%d\n",&a,&b);
Update( b, a );
}
else
if (t==1)
{
scanf("%d%d\n",&a,&b);
printf("%d\n",query(a,b));
}
else
{
scanf("%d\n",&a);
printf("%d\n",verific_binar(a));
}
}
return 0;
}