Pagini recente » Cod sursa (job #2676269) | Cod sursa (job #2322356) | Cod sursa (job #675249) | Cod sursa (job #3273767) | Cod sursa (job #1151429)
#include <cstdio>
#define nmax 100000+5
using namespace std;
int N, M;
int v[nmax];
int z(int x)
{
return x & ~(x-1);
}
void adunare(int a, int b)
{
while (a <= N)
{
v[a] += b;
a += z(a);
}
}
int suma1(int a)
{
int s = 0;
while (a > 0)
{
s += v[a];
a -= z(a);
}
return s;
}
int suma2(int a, int b)
{
return suma1(b) - suma1(a-1);
}
int cautare(int s)
{
int i, pas;
pas = 1;
while (pas < N)
pas <<= 1;
for (i = 0; pas; pas >>= 1)
if (i+pas <= N && v[i+pas] <= s)
{
i += pas;
s -= v[i];
if (s == 0)
return i;
}
return -1;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int i, j;
int c;
int a, b;
scanf("%d%d", &N, &M);
for (i = 1; i <= N; i++)
{
scanf("%d", &c);
adunare(i, c);
}
for (j = 1; j <= M; j++)
{
scanf("%d", &c);
if (c == 0)
{
scanf("%d%d", &a, &b);
adunare(a, b);
}
else if (c == 1)
{
scanf("%d%d", &a, &b);
printf("%d\n", suma2(a, b));
}
else if (c == 2)
{
scanf("%d", &a);
printf("%d\n", cautare(a));
}
}
return 0;
}