Pagini recente » Cod sursa (job #257314) | Cod sursa (job #1156570) | Cod sursa (job #2583818) | Cod sursa (job #498465) | Cod sursa (job #2415060)
#include <bits/stdc++.h>
#define Nmax 100000
#define lsb(x) (x&(-x))
using namespace std;
int N, Q;
int AIB[Nmax + 5];
inline void update (int poz, int val);
inline int query (int poz);
inline int binarySearch (int val);
int main()
{
freopen ("aib.in", "r", stdin);
freopen ("aib.out", "w", stdout);
scanf ("%d %d", &N, &Q);
for (int i = 1; i <= N; ++i)
{
int x;
scanf ("%d", &x);
update (i, x);
}
while (Q--)
{
int TASK;
scanf ("%d", &TASK);
if (TASK == 0)
{
int val, poz;
scanf ("%d %d", &poz, &val);
update (poz, val);
}
if (TASK == 1)
{
int lo, ri;
scanf ("%d %d", &lo, &ri);
printf ("%d\n", query (ri) - query (lo - 1));
}
if (TASK == 2)
{
int sum;
scanf ("%d", &sum);
printf ("%d\n", binarySearch (sum));
}
}
return 0;
}
inline void update (int poz, int val)
{
while (poz <= N)
{
AIB[poz] += val;
poz += lsb (poz);
}
}
inline int query (int poz)
{
int sum = 0;
while (poz)
{
sum += AIB[poz];
poz -= lsb (poz);
}
return sum;
}
inline int binarySearch (int sum)
{
int left = 1, right = N, mid = 0;
while (left <= right)
{
mid = (left + right) / 2;
if (AIB[mid] > sum)
right = mid - 1;
else if (AIB[mid] < sum)
left = mid + 1;
else return mid;
}
return -1;
}