Pagini recente » Cod sursa (job #1518733) | Cod sursa (job #97192) | Cod sursa (job #1333803) | Cod sursa (job #295318) | Cod sursa (job #2572451)
#include <fstream>
#define LSB(x) x^(x&(x-1))
using namespace std;
ifstream fi("aib.in");
ofstream fo("aib.out");
const int nmax=1e5;
int n, m, pow2=1;
int X[nmax+5], aib[nmax+5];
void update(int pos, int val)
{
while(pos<=n)
{
aib[pos]+=val;
pos+=LSB(pos);
}
}
int suma(int pos)
{
int s=0;
while(pos)
{
s+=aib[pos];
pos-=LSB(pos);
}
return s;
}
int posmin(int val)
{
int s=0, i, hi=pow2;
for(i=0; hi && s<val; hi/=2)
if(s+aib[i+hi]<=val)
{
s+=aib[i+hi];
i+=hi;
}
if(s==val)
return i;
return -1;
}
int main()
{
fi>>n>>m;
for(int i=1; i<=n; i++)
{
fi>>X[i];
update(i, X[i]);
}
while(pow2*2<=n)
pow2*=2;
while(m--)
{
int q, a, b;
fi>>q>>a;
if(q==0)
{
fi>>b;
update(a, b);
}
else if(q==1)
{
fi>>b;
fo<<suma(b)-suma(a-1)<<"\n";
}
else
fo<<posmin(a)<<"\n";
}
fi.close();
fo.close();
return 0;
}