Pagini recente » Cod sursa (job #2117107) | Cod sursa (job #2510781) | Cod sursa (job #2667547) | Cod sursa (job #2444453) | Cod sursa (job #1584365)
#include <cstdio>
using namespace std;
int arb[100001],n;
int tata(int k)
{
return k&(k-1);
}
int next(int k)
{
return k+((k^(k-1))+1)/2;
}
void aduna(int i,int x)
{
do
{
arb[i]+=x;
i=next(i);
}while(i<=n);
}
int suma(int i)
{
int s=0;
while(i)
{
s+=arb[i];
i=tata(i);
}
return s;
}
int det(int s)
{
int li=1,lf=n,m=(li+lf)/2,ssp;
while(li<=lf&&(ssp=suma(m))!=s)
{
if(s<ssp)
lf=m-1;
else
li=m+1;
m=(li+lf)/2;
}
if(li>lf)return -1;
return m;
}
int main()
{
int m,x,i,y,op;
FILE *f=fopen("aib.in","r"),*f1;
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=n;i++)
{
fscanf(f,"%d",&x);
aduna(i,x);
}
f1=fopen("aib.out","w");
for(i=1;i<=m;i++)
{
fscanf(f,"%d",&op);
if(op==0)
{
fscanf(f,"%d%d",&x,&y);
aduna(x,y);
}
if(op==1)
{
fscanf(f,"%d%d",&x,&y);
fprintf(f1,"%d\n",suma(y)-suma(x-1));
}
if(op==2)
{
fscanf(f,"%d",&x);
fprintf(f1,"%d\n",det(x));
}
}
return 0;
}