Pagini recente » Cod sursa (job #211398) | Cod sursa (job #152510) | Cod sursa (job #914443) | Cod sursa (job #1793199) | Cod sursa (job #2513472)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int NMAX = 100005; //Marimea sirului
int N, M, Arb[NMAX]; //Variabile basic
int C, Sum, T;
inline int Minim(int a, int b) {
return (a < b) ? a : b;
}
void Update(int, int);
int Query(int);
int Search(int);
int main(void)
{
memset(Arb, 0, sizeof(Arb));
int X, A, B;
fin >> N >> M;
for(int i = 1; i <= N; i++) {
fin >> T;
Update(i, T);
}
for(; M; M--) {
fin >> X;
if(X < 2) {
fin >> A >> B;
if(!X)
Update(A, B);
else
fout << Query(B) - Query(A-1) << "\n";
}
else {
fin >> A;
fout << Search(A) << "\n";
}
}
}
int Search(int x)
{
int i, step;
for(step = 1; step < N; step <<= 1);
for(i = 0; step; step >>= 1) {
if(i + step <= N)
if(x >= Arb[i + step]) {
i += step;
x -= Arb[i];
if(!x)
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, Sum = 0;
while(poz > 0) {
Sum += Arb[poz];
while(!(poz & (1 << C)))
C++;
poz -= (1 << C);
C += 1;
}
return Sum;
}