Pagini recente » Cod sursa (job #2520543) | Cod sursa (job #282836) | Cod sursa (job #823053) | Cod sursa (job #17629) | Cod sursa (job #218518)
Cod sursa(job #218518)
#include <cstdio>
#define MAXIMUS 100002
#define f(x)((x^(x-1))&x)
using namespace std;
int n,m,arb[MAXIMUS];
void update(int pozitie,int valoare)
{
while(pozitie<=n)
{
arb[pozitie]+=valoare;
pozitie+=f(pozitie);
}
}
int aduna(int pozitie)
{
int s=0;
while(pozitie>0)
{
s+=arb[pozitie];
pozitie-=f(pozitie);
}
return s;
}
int minim(int x)
{
int p;
for(p=1;p<n;p*=2);
for(int i=0;p;p/=2)
if(i+p<=n)
{
if(x>=arb[i+p])
{
x-=arb[i+p];
i+=p;
if(x==0)
return i;
}
}
return -1;
}
void solve()
{
scanf("%d%d",&n,&m);
int x;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
update(i,x);
}
for(int i=0;i<m;i++)
{
int zz,x,y;
scanf("%d",&zz);
if(zz==0)
{
scanf("%d%d",&x,&y);
update(x,y);
}
else
if(zz==1)
{
scanf("%d%d",&x,&y);
printf("%d\n",aduna(y)-aduna(x-1));
}
else
{
scanf("%d",&x);
printf("%d\n",minim(x));
}
}
}
int main(){
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
solve();
fclose(stdout);
return 0;
}