Pagini recente » Cod sursa (job #1861594) | Cod sursa (job #2263070) | Cod sursa (job #472937) | Cod sursa (job #1188241) | Cod sursa (job #1689392)
#include <iostream>
#include <cstdio>
#define MAXN 100050
using namespace std;
int n, m;
struct arbore
{
int *mem, sz;
arbore(int sz = 0)
{
mem = new int[sz+1];
this->sz = sz;
}
inline int zero(int x)
{
return (x^(x-1))&x;
}
void update(int ind, int val)
{
for (int i = ind; i <= sz; i+=zero(i))
mem[i] += val;
}
int sum(int st, int dr)
{
return sum(dr)-sum(st-1);
}
int sum(int dr)
{
int rez = 0;
for (int i = dr; i > 0; i -= zero(i))
rez += mem[i];
return rez;
}
int lookup(int val)
{
int step, rez = 0, sum = 0;
for (step = 1; step < sz; step <<= 1);
for (rez = 0; step; step >>= 1) {
if (rez + step <= sz && sum + mem[rez+step] <= val)
rez += step, sum += mem[rez];
}
if (sum == val)
return rez;
return -1;
}
}aib;
void citire()
{
scanf("%d %d\n", &n, &m);
aib = arbore(n);
int x;
for (int i = 1; i <= n; i++) {
scanf("%d", &x);
aib.update(i, x);
}
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
citire();
for (int i = 1; i <= m; i++) {
int tip, a, b;
scanf("%d", &tip);
if (tip == 0) {
scanf("%d %d", &a, &b);
aib.update(a, b);
}
else if (tip == 1) {
scanf("%d %d", &a, &b);
printf("%d\n", aib.sum(a, b));
}
else if (tip == 2) {
scanf("%d", &a);
printf("%d\n", aib.lookup(a));
}
}
return 0;
}