Pagini recente » Cod sursa (job #2834835) | Cod sursa (job #1563319) | Cod sursa (job #1155485) | Cod sursa (job #2605757) | Cod sursa (job #229329)
Cod sursa(job #229329)
#include <cstdio>
using namespace std;
#define MAXN 100005
int N, M;
int v[MAXN], aib[MAXN];
inline int query(int poz)
{
int Sum = 0;
for (; poz; poz &= poz - 1)
Sum += aib[poz];
return Sum;
}
inline void add(int poz, int val)
{
for (; poz <= N; poz += (poz ^ (poz - 1)) & poz)
aib[poz] += val;
}
int main()
{
freopen("aib.in", "rt", stdin);
#ifndef DEBUG
freopen("aib.out", "wt", stdout);
#endif
scanf("%d %d", &N, &M);
for (int i = 1; i <= N; i++)
scanf("%d", v + i),
add(i, v[i]);
for (int i = 0; i < M; i++)
{
int type;
scanf("%d", &type);
if (type == 0)
{
int poz, val;
scanf("%d %d", &poz, &val);
add(poz, val);
}
if (type == 1)
{
int l, r;
scanf("%d %d", &l, &r);
printf("%d\n", query(r) - query(l - 1));
}
if (type == 2)
{
int sum;
scanf("%d", &sum);
int poz = 0, step = 1 << 16;
int curSum = 0;
for (; step; step >>= 1)
{
if (poz + step <= N && curSum + aib[poz + step] <= sum)
curSum += aib[poz + step],
poz += step;
}
printf("%d\n", (query(poz) == sum) ? (poz - (poz == 0)) : -1);
}
}
return 0;
}