Pagini recente » Cod sursa (job #2711391) | Cod sursa (job #2181983) | Cod sursa (job #2832209) | Cod sursa (job #514375) | Cod sursa (job #2572540)
#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, putere=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 i, pow2=putere;
for(i=0; pow2; pow2/=2)
if(i+pow2<=n && aib[i+pow2]<=val)
{
val-=aib[i+pow2];
i+=pow2;
if(val==0)
return i;
}
return -1;
}
int main()
{
fi>>n>>m;
for(int i=1; i<=n; i++)
{
fi>>X[i];
update(i, X[i]);
}
while(putere*2<=n)
putere*=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;
}