Pagini recente » Cod sursa (job #1986969) | Cod sursa (job #2396804) | Cod sursa (job #219884) | Cod sursa (job #3251070) | Cod sursa (job #2088729)
#include <bits/stdc++.h>
#define in "aib.in"
#define out "aib.out"
#define MN 100005
using namespace std;
int N, M, Arb[4*MN];
void update(int poz, int val);
int query(int poz);
int aibsrc(int val);
int main()
{
assert(freopen(in, "r", stdin));
assert(freopen(out,"w", stdout));
assert(scanf("%d%d", &N, &M));
for(int x, i = 1; i <= N; ++i)
{
assert(scanf("%d", &x));
update(i, x);
}
for(int tip, a, b; M; --M)
{
assert(scanf("%d", &tip));
if(tip < 2)
{
assert(scanf("%d%d", &a, &b));
if(!tip) update(a, b);
else assert(printf("%d\n", query(b)-query(a-1)));
}
else
{
assert(scanf("%d", &a));
assert(printf("%d\n", aibsrc(a)));
}
}
return 0;
}
void update(int poz, int val)
{
while(poz <= N)
{
Arb[poz] += val;
poz += (poz & -poz);
}
}
int query(int poz)
{
int sum = 0;
while(poz > 0)
{
sum += Arb[poz];
poz -= (poz & -poz);
}
return sum;
}
int aibsrc(int val)
{
int step, i;
for(step = 1; step < N; step <<= 1);
for(i = 0; step; step >>= 1)
if(i + step <= N)
if(Arb[i+step] <= val)
{
i += step;
val -= Arb[i];
if(!val) return i;
}
return -1;
}