Pagini recente » Cod sursa (job #433620) | Profil M@2Te4i | Cod sursa (job #441340) | Cod sursa (job #1134557) | Cod sursa (job #1150169)
#include <fstream>
#define lsb(x) -x&x
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int N, M, x, tip, val, aib[100002], poz, a, b, pas;
inline void update(int poz, int val)
{
while (poz<=N)
aib[poz]+=val, poz+=lsb(poz);
}
inline int query(int poz)
{
int res=0;
while (poz)
res+=aib[poz], poz-=lsb(poz);
return res;
}
int main()
{
f>>N>>M;
for (int i=1; i<=N; ++i)
f>>x, update(i, x);
for (pas=1; pas<=N; pas<<=1);
for (int i=1; i<=M; ++i)
{
f>>tip;
if (!tip) f>>poz>>val, update(poz, val);
else if (tip==1) f>>a>>b, g<<query(b)-query(a-1)<<'\n';
else
{
int ans=0, sum, aux; f>>sum; aux=sum;
for (int i=pas; i; i>>=1)
if (i+ans<=N && aib[i+ans]<=sum)
{
sum-=aib[i+ans], ans+=i;
if(sum==0) { ans=-1; break; }
}
g<<ans<<'\n';
}
}
return 0;
}