Pagini recente » Cod sursa (job #1017731) | Cod sursa (job #94583) | Cod sursa (job #2410044) | Cod sursa (job #2563336) | Cod sursa (job #2070664)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int Nmax = 100000 + 5;
int n, m, a[Nmax], pas, pasinit = 1;
void update(int x, int y)
{
for(int i = x; i <= n; i += (i & -i))
a[i] += y;
}
int query(int x)
{
int sum = 0;
for(int i = x; i > 0; i -= (i & -i))
sum += a[i];
return sum;
}
int cautbin(int x)
{
pas = pasinit;
for(int i = 0; i + pas <= n && pas > 0; pas>>= 1)
{
if(x >= a[i + pas])
{
x -= a[i + pas];
i = i + pas;
if(x == 0)
return i;
}
}
return -1;
}
int main()
{
fin >> n >> m;
for(int i = 1, x; i <= n; ++i)
fin >> x, update(i, x);
while(pasinit < n)
pasinit <<= 1;
for(int i = 1,x, y, vr; i <= m; ++i)
{
fin >> vr;
if(vr == 0)
{
fin >> x >> y;
update(x, y);
}
else if(vr == 1)
{
fin >> x >> y;
fout << query(y) - query(x - 1) << '\n';
}
else
{
fin >> x;
fout << cautbin(x) << '\n';
}
}
return 0;
}