Pagini recente » Cod sursa (job #2054631) | Cod sursa (job #1639346) | Cod sursa (job #2597745) | Cod sursa (job #1246155) | Cod sursa (job #183032)
Cod sursa(job #183032)
#include <cstdio>
#include <cstring>
using namespace std;
#define FIN "aib.in"
#define FOUT "aib.out"
#define MAX_N 100005
int A[MAX_N];
int C[MAX_N];
int N, M;
void buildtree ()
{
int i, p;
for (i = 1; i <= N; ++i)
{
p = i^(i&(i - 1));
C[i] = A[i] - A[i - p];
}
}
void update (int c, int pz)
{
int p;
while (pz <= N)
{
C[pz] += c, pz += p = pz^(pz&(pz - 1));
}
}
int query (int a, int b)
{
int ind, p;
int s1 = 0, s2 = 0;
for (ind = a - 1; ind > 0;) s1 += C[ind], ind -= p = ind^(ind&(ind - 1));
for (ind = b; ind > 0;) s2 += C[ind], ind -= p = ind^(ind&(ind - 1));
return s2 - s1;
}
int bsearch (int c)
{
int li, lf, m, ret = -1;
li = 1, lf = N;
while (li <= lf)
{
m = (li + lf) >> 1;
int q = query (1, m);
if (q == c) ret = m, lf = m - 1;
if (q > c) lf = m - 1;
if (q < c) li = m + 1;
}
return ret;
}
int main ()
{
freopen (FIN, "r", stdin);
freopen (FOUT, "w", stdout);
scanf ("%d %d", &N, &M);
int i;
for (i = 1; i <= N; ++i)
{
int x;
scanf ("%d", &x);
A[i] = A[i - 1] + x;
}
buildtree ();
for (i = 1; i <= M; ++i)
{
int tp, a, b;
scanf ("%d", &tp);
if (!tp)
scanf ("%d %d", &a, &b), update (b, a);
if (tp == 1)
scanf ("%d %d", &a, &b), printf ("%d\n", query(a, b));
if (tp == 2)
scanf ("%d", &a), printf ("%d\n", bsearch(a));
}
return 0;
}