Pagini recente » Istoria paginii utilizator/casian307 | Cod sursa (job #53469) | Istoria paginii utilizator/osamabinlanden | Istoria paginii runda/proba_pregatire_ioit/clasament | Cod sursa (job #1765053)
#include<bits/stdc++.h>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,q,aib[100010];
void update(int x, int val)
{
for (;x<=n;x+=(x^(x-1))&x)
aib[x]+=val;
}
int query(int x)
{
int s=0;
for(;x;x-=(x^(x-1))&x)
s+=aib[x];
return s;
}
int searcH(int val)
{
int i,step;
for(step=1;step<=n;step<<=1);
step>>=1;
for(i=0;step;step>>=1)
{
if(i+step<=n)
{
if(aib[i+step]<=val)
{
i+=step;
val-=aib[i];
if(!val)
return i;
}
}
}
return -1;
}
int main()
{
f>>n>>q;
for(int i=1;i<=n;++i)
{
int x;
f>>x;
update(i, x);
}
for(int i=1;i<=q;++i)
{
int p,x,y;
f>>p;
if(!p)
{
f>>x>>y;
update(x, y);
}
else if (p==1)
{
f>>x>>y;
g<<query(y)-query(x-1)<<'\n';
}
else
{
f>>x;
g<<searcH(x)<<'\n';
}
}
return 0;
}