Pagini recente » Cod sursa (job #1229883) | Cod sursa (job #3264414) | Cod sursa (job #1158099) | Cod sursa (job #337566) | Cod sursa (job #545843)
Cod sursa(job #545843)
#include<stdio.h>
#define nrn 100001
#define zzz(x) ((x^(x-1))&x)
using namespace std;
FILE *in=fopen("aib.in","r"),*out=fopen("aib.out","w");
int AIB[nrn],n,m;
void upup(int i,int val)
{
for(i;i<=n;i+=zzz(i))
AIB[i]+=val;
}
int suma(int ind)
{
int i,sum=0;
for(i=ind;i>0;i-=zzz(i))
sum+=AIB[i];
return sum;
}
void unu()
{
int a,b;
fscanf(in,"%d %d",&a,&b);
upup(a,b);
}
void doi()
{
int a,b;
fscanf(in,"%d %d",&a,&b);
fprintf(out,"%d\n",suma(b)-suma(a-1));
}
void trei()
{
int a,mij,dr,st;
fscanf(in,"%d",&a);
dr=n;st=1;mij=(dr+st)/2;
while(st<=dr&&suma(mij)!=a)
{
if(suma(mij)>a)
dr=mij-1;
else st=mij+1;
mij=(st+dr)/2;
}
if(suma(mij)==a)
fprintf(out,"%d\n",mij);
else fprintf(out,"-1\n");
}
int main()
{
int i,x,c;
fscanf(in,"%d %d",&n,&m);
for(i=1;i<=n;++i)
{
fscanf(in,"%d",&x);
upup(i,x);
}
for(i=1;i<=m;i++)
{
fscanf(in,"%d",&c);
switch(c)
{
case(0):unu();break;
case(1):doi();break;
case(2):trei();break;
}
}
return 0;
}