Pagini recente » Cod sursa (job #44516) | Cod sursa (job #669517) | Cod sursa (job #2131102) | Cod sursa (job #1817623) | Cod sursa (job #747791)
Cod sursa(job #747791)
#include <cstdio>
using namespace std;
const int maxn = 100005;
int n, m, aib[maxn], a, b, x, tip, v[maxn];
int lsb(int x)
{
return (x & (x - 1)) ^ x;
}
void update(int a, int b)
{
int i;
for(i = a; i <= n; i += lsb(i))
aib[i] += b;
}
int query(int a)
{
int rez = 0, i;
for(i = a; i >= 1; i -= lsb(i))
rez += aib[i];
return rez;
}
int cauta_binar(int x)
{
int p, u, mij, sol = -1;
p = 1;
u = n;
while(p <= u) {
mij = (p + u) / 2;
if(query(mij) == x) {
sol = mij;
u = mij - 1;
}
if(query(mij) > x)
u = mij - 1;
else p = mij + 1;
}
return sol;
}
int main()
{
int i;
freopen ("aib.in", "r", stdin);
freopen ("aib.out", "w", stdout);
scanf("%d %d", &n, &m);
for(i = 1; i <= n; ++i) {
scanf("%d", &v[i]);
update(i, v[i]);
}
for(i = 1; i <= m; ++i) {
scanf("%d", &tip);
if(tip == 0) {
scanf("%d %d", &a, &b);
update(a, b);
}
if(tip == 1) {
scanf("%d %d", &a, &b);
printf("%d\n", query(b) - query(a - 1));
}
else if (tip == 2) {
scanf("%d", &x);
printf("%d\n", cauta_binar(x));
}
}
return 0;
}