Pagini recente » Cod sursa (job #1796364) | Cod sursa (job #1247481) | Cod sursa (job #1459983) | Cod sursa (job #1674341) | Cod sursa (job #233306)
Cod sursa(job #233306)
#include<stdio.h>
#define bit(x) ( (x) & ( (x) - 1) ^ (x) )
FILE*f=fopen("aib.in","r");
FILE*g=fopen("aib.out","w");
int n,aib[100003];
int m;
void update(int x, int v) //a[x]+=v
{
for(;x<=n;x+=bit(x)) aib[x]+=v;
}
int query(int x) // returnez suma de la 1 la x
{
int s=0;
for(;x;x-=bit(x)) s+=aib[x];
return s;
}
int min(int a)
{
//suma valorilor primilor k termeni = a
int q,i,j,m;
i=1; j=n;
while(i<=j)
{
m=(i+j)/2;
q=query(m);
if(q == a)
{
if(query(m-1) == a) j=m-1;
return m;
}
else if(q < a) i=m+1;
else j=m-1;
}
return -1;
}
int main()
{
fscanf(f,"%d %d",&n, &m);
int a,b,x,i,rez;
for(i=1;i<=n;++i)
{
fscanf(f,"%d",&x);
update(i,x);
}
while(m--)
{
fscanf(f,"%d",&x);
switch(x)
{
case 0:
{
fscanf(f,"%d %d",&a,&b);
update(a,b);
break;
}
case 1:
{
fscanf(f,"%d%d",&a,&b);
fprintf(g,"%d\n",query(b) - query(a-1));
break;
}
case 2:
{
fscanf(f,"%d",&a);
rez=min(a);
fprintf(g,"%d\n",rez);
break;
}
}
}
return 0;
}