Pagini recente » Cod sursa (job #1036817) | Cod sursa (job #2372253) | Cod sursa (job #2378747) | Cod sursa (job #2856667) | Cod sursa (job #1778639)
#include <cstdio>
using namespace std;
const int NMAX = 100000;
int aib[NMAX + 5], n;
void update(int p, int x)
{
while (p <= n)
{
aib[p] += x;
p += (p & (-p));
}
}
int query(int p)
{
int ans = 0;
while (p > 0)
{
ans += aib[p];
p -= (p & (-p));
}
return ans;
}
int bs(int x)
{
int st, dr, med, last = -1, rez;
st = 1; dr = n;
while (st <= dr)
{
med = (st + dr) / 2;
rez = query(med);
if (rez == x)
return med;
else if (rez > x)
dr = med - 1;
else //if (sp[med] < x)
st = med + 1;
}
return last;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int m, x, a, b, tip;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i)
{
scanf("%d", &x);
update(i, x);
}
for (int i = 1; i <= m; ++i)
{
scanf("%d", &tip);
if (tip == 0)
{
scanf("%d %d", &a, &b);
update(a, b);
}
else if (tip == 1)
{
scanf("%d %d", &a, &b);
printf("%d\n", query(b) - query(a - 1));
}
else //if (tip == 3)
{
scanf("%d", &x);
printf("%d\n", bs(x));
}
}
return 0;
}