Pagini recente » Cod sursa (job #231735) | Cod sursa (job #2335563)
#include <bits/stdc++.h>
using namespace std;
#define dim 100001
ifstream fin ("aib.in"); ofstream fout ("aib.out");
inline int Minim (int a, int b)
{
if (a < b) return a; return b;
}
int N, M, T;
int Arb[dim];
int C, S;
void Update (int, int);
int Query (int);
int Search (int);
int main ()
{
memset (Arb, 0, sizeof(Arb));
int K, X, Y;
fin >> N >> M;
for (int i = 1; i <= N; i++)
{
fin >> T;
Update(i,T);
}
for ( ; M; M--)
{
fin >> K;
if (K < 2)
{
fin >> X >> Y;
if (!K) Update (X, Y);
else fout << Query(Y) - Query (X - 1) << '\n';
}
else
{
fin >> X;
fout << Search(X) << '\n';
}
}
}
int Search(int val)
{
int i, step;
for (step = 1; step < N; step <<= 1);
for (i = 0; step; step >>= 1)
{
if (i + step <= N)
{
if (val >= Arb [i + step])
{
i += step, val -= Arb[i];
if (!val) return i;
}
}
}
return -1;
}
void Update(int poz, int val)
{
C = 0;
while (poz <= N)
{
Arb[poz] += val;
while (!(poz & (1 << C))) C++;
poz += (1 << C);
C +=1 ;
}
}
int Query(int poz)
{
C = 0; S = 0;
while (poz > 0)
{
S += Arb[poz];
while (!(poz & (1 << C))) C++;
poz -= (1 << C);
C += 1;
}
return S;
}