Pagini recente » Cod sursa (job #1324731) | Cod sursa (job #3211614) | Cod sursa (job #268263) | Cod sursa (job #2713856) | Cod sursa (job #367743)
Cod sursa(job #367743)
#include<fstream.h>
long n,m;
int c[100001],a;
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;
}
void creare(int i)
{
int k=0;
c[i]+=a;
while((i&(1<<k))==0)k++;
c[i]+=(suma(1,i-1)-suma(1,i-(1<<k)));
}
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;
creare(i);}
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;
}