Pagini recente » Cod sursa (job #1253513) | Cod sursa (job #2454150) | Cod sursa (job #2151198) | Cod sursa (job #624151) | Cod sursa (job #367736)
Cod sursa(job #367736)
#include<fstream.h>
int a[100],c[100],n,m;
void creare()
{
int i=1,j,k,t;
while(i<=n)
{
k=0;
while((i&(1<<k))==0)k++;
t=i-(1<<k)+1;
for(j=t;j<=i;j++)
c[i]+=a[j];
i++;
}
}
void adunare(int i, int x)
{
int k=0;
while(i<=n)
{
c[i]+=x;
while((i&(1<<k))==0)k++;
i+=(1<<k);
k++;
}
}
int suma(int i)
{
int s=0,k=0;
while(i>0)
{
s+=c[i];
while((i&(1<<k))==0)k++;
i-=(1<<k);
k++;
}
return s;
}
int cautare(int x)
{int p=1;int k=0;
while(p<=n)p<<=1;
while(p)
{ if(k+p <=n)
{
if(x>=c[k+p])
{k+=p;
x-=c[k];
if(!x)return k;
}}
p>>=1;
}
return -1;
}
int main()
{
int i,op,x,y,gasit,s,d,m,mij;
ifstream f("aib.in");
ofstream g("aib.out");
f>>n>>m;
for(i=1;i<=n;i++)f>>a[i];
creare();
for(i=1;i<=m;i++)
{
f>>op;
if(op==0)
{
f>>x>>y;
adunare(x,y);
}
else if(op==1)
{
f>>x>>y;
g<<suma(y)-suma(x-1)<<'\n';
}
else
{
f>>x;
g<<cautare(x)<<'\n';
}
}
return 0;
}