Pagini recente » Cod sursa (job #1403282) | Cod sursa (job #579391) | Rezultatele filtrării | Cod sursa (job #2231627) | Cod sursa (job #1162995)
#include <fstream>
#define lsb(x) -x&x
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int N, M, x, aib[100005], tip, A, B, pas=1;
void update(int poz, int val)
{
while (poz<=N)
aib[poz]+=val, poz+=lsb(poz);
}
int query(int poz)
{
int sum=0;
while (poz)
sum+=aib[poz], poz-=lsb(poz);
return sum;
}
int main()
{
f>>N>>M;
for (; pas<=N; pas<<=1);
for (int i=1; i<=N; ++i)
f>>x, update(i, x);
for (int ii=1; ii<=M; ++ii)
{
f>>tip>>A;
if (!tip) f>>B, update(A, B);
else if (tip==1) f>>B, g<<query(B)-query(A-1)<<'\n';
else
{
int lg=pas, i=0, sol=-1;
for (; lg; lg>>=1)
if (i+lg<=N && aib[i+lg]<=A)
{
A-=aib[i+lg]; i+=lg;
if (A==0) { sol=i; break; }
}
g<<sol<<'\n';
}
}
return 0;
}