Pagini recente » Cod sursa (job #2770659) | Cod sursa (job #2668371) | Cod sursa (job #558448) | Cod sursa (job #3235677) | Cod sursa (job #491717)
Cod sursa(job #491717)
#include <iostream>
#include <string>
using namespace std;
#define NM 100005
#define lsb(x)(((x)^(x-1))&(x))
int AIB[NM], N, M;
int query(int pos)
{
int ans = 0;
while (pos)
{
ans += AIB[pos];
pos -= lsb(pos);
}
return ans;
}
void update(int val, int pos)
{
while (pos <= N)
{
AIB[pos] += val;
pos += lsb(pos);
}
}
int main()
{
int a, b, op;
freopen ("aib.in", "r", stdin);
freopen ("aib.out", "w", stdout);
scanf ("%d %d", &N, &M);
for (int i = 1; i <= N; ++i)
{
scanf ("%d", &a);
update (a, i);
}
while (M--)
{
scanf ("%d", &op);
if (op == 0)
{
scanf ("%d %d", &a, &b);
update (b, a);
}
else if (op == 1)
{
scanf ("%d %d", &a, &b);
printf ("%d\n", query(b) - query(a - 1));
}
else if (op == 2)
{
scanf ("%d", &a);
int st = 0, dr = N;
while (st < dr)
{
int mij = (st + dr)/2;
int ansc = query(mij);
if (ansc > a) dr = mij - 1;
else if (ansc == a) dr = mij;
else st = mij + 1;
}
int ind = st;
if (ind > N || query(ind) != a) printf ("-1\n");
else printf ("%d\n", ind);
}
}
return 0;
}