Pagini recente » Cod sursa (job #2596844) | Cod sursa (job #75488) | Cod sursa (job #932443) | Cod sursa (job #2293273) | Cod sursa (job #294841)
Cod sursa(job #294841)
#include<fstream.h>
#define nmax 100001
int aib[nmax],i,j,k,l,m,n,x,y;
ifstream f("aib.in");
ofstream g("aib.out");
void upd(int poz,int val)
{
int k=0;
while(poz<=n)
{
aib[poz]+=val;
while(!(poz&(1<<k)))
k++;
poz+=1<<k;
k++;
}
}
int querry(int poz)
{
int k=0,sum=0;
while(poz>0)
{
sum+=aib[poz];
while(!(poz&(1<<k)))
k++;
poz-=1<<k;
k++;
}
return sum;
}
int search(int val)
{
int i,step;
for(step=1;step<n;step<<=1);
for(i=0;step;step>>=1)
{
if(i+step<=n)
{
if(val>=aib[i+step])
{
i+=step;
val-=aib[i];
if(!val) return i;
}
}
}
return -1;
}
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>x;
upd(i,x);
}
for(i=1;i<=m;i++)
{
f>>k;
if(k==0)
{
f>>x>>y;
upd(x,y);
}
else
if(k==1)
{
f>>x>>y;
g<<querry(y)-querry(x-1)<<'\n';
}
else
{
f>>x;
g<<search(x)<<'\n';
}
}
return 0;
}