Pagini recente » Cod sursa (job #2813132) | Cod sursa (job #1447454) | Cod sursa (job #1879692) | Cod sursa (job #1129662) | Cod sursa (job #808648)
Cod sursa(job #808648)
#include <cstdio>
using namespace std;
int n, nOp, poz, c[100001];
int lowbit(int x){
return x & (-x);
}
void Actualizare(int ind, int val){
while (ind <= n){
c[ind] += val;
ind += lowbit(ind);
}
}
int Suma(int ind){
int s = 0;
while (ind > 0){
s += c[ind];
ind -= lowbit(ind);
}
return s;
}
int Suma(int x, int y){return Suma(y) - Suma(x-1);}
int Cauta(int x){
int i = 0, ind = 0;
for (ind = 1; ind < n; ind <<= 1);
for (i = 0; ind; ind >>= 1)
if (i + ind <= n && c[i + ind] <= x){
i += ind;
x -= c[i];
if (x == 0) return i;
}
return -1;
}
int main()
{
freopen ("aib.in", "r", stdin), freopen("aib.out", "w", stdout);
scanf("%d %d", &n, &nOp);
int i, x, y, op;
for (i = 1; i <= n; i++){
scanf("%d", &x);
Actualizare (i, x);
}
for (i = 0; i < nOp; i++){
scanf("%d %d", &op, &x);
switch (op){
case 0 :
scanf("%d", &y);
Actualizare(x, y);
break;
case 1:
scanf("%d", &y);
printf ("%d\n", Suma(x, y));
break;
case 2:
printf ("%d\n",Cauta(x));
}
}
}