Pagini recente » Monitorul de evaluare | Cod sursa (job #1245374) | Cod sursa (job #1652684) | Cod sursa (job #694533) | Cod sursa (job #713508)
Cod sursa(job #713508)
#include<cstdio>
#define nmax 100010
using namespace std;
int n,m,v[nmax],cod,a,b,x;
void upd(int poz, int val)
{
int z=0;
while(poz<=n)
{
v[poz]+=val;
while(!(poz&(1<<z)))
z++;
poz+=(1<<z);
z++;
}
}
int sum(int poz)
{
int z,S;
z=0;
S=0;
while(poz>0)
{
S+=v[poz];
while(!(poz&(1<<z)))
z++;
poz-=(1<<z);
z++;
}
return S;
}
int elem(int val)
{
int i,j;
for(j=1;j<n;j*=2);
for(i=0;j;j/=2)
{
if(i+j<=n)
{
if(val>=v[i+j])
{
i+=j;
val-=v[i];
if(!val)
return i;
}
}
}
return -1;
}
int main()
{
int i;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d", &n, &m);
for(i=1;i<=n;i++)
{
scanf("%d", &x);
upd(i,x);
}
for(i=1;i<=m;i++)
{
scanf("%d", &cod);
if(cod<2)
{
scanf("%d%d", &a, &b);
if(!cod)
upd(a,b);
else
printf("%d\n", sum(b)-sum(a-1));
}
else
{
scanf("%d", &a);
printf("%d\n", elem(a));
}
}
return 0;
}