Pagini recente » Cod sursa (job #391948) | Cod sursa (job #948038) | Cod sursa (job #2761719) | Cod sursa (job #2556642) | Cod sursa (job #717946)
Cod sursa(job #717946)
#include <stdio.h>
#define nMax 100010
using namespace std;
int n;
int a[nMax];
void adauga(int pozitie, int valoare)
{
int k = 0;
while (pozitie <= n){
a[pozitie] += valoare;
while ( (pozitie & (1 << k) ) == 0){
k ++;
}
pozitie += 1 << k;
k ++;
}
}
int suma (int pozitie)
{
int k = 0;
int s = 0;
while (pozitie > 0){
s += a[pozitie];
while (!(pozitie & (1 << k))){
k ++;
}
pozitie -= 1 << k;
k ++;
}
return s;
}
int interval (int x, int y)
{
return suma(y) - suma(x - 1);
}
void caz2(int x)
{
int st = 1;
int dr = n + 1;
int mij;
while (st != dr){
mij = (st + dr) >> 1;
int s = suma (mij);
if (s == x){
break;
}
if (s < x){
st = mij + 1;
}else{
dr = mij;
}
}
while (suma (mij - 1) == x){
mij --;
}
printf ("%d\n", mij);
}
void citire()
{
int operatii;
scanf ("%d %d", &n, &operatii);
for (int i = 1; i <= n; ++ i){
int x;
scanf ("%d", &x);
adauga (i, x);
}
while (operatii --){
int caz;
int x;
scanf ("%d", &caz);
scanf ("%d", &x);
if (caz == 2){
caz2(x);
continue;
}
int y;
scanf ("%d", &y);
if (caz == 0){
adauga (x, y);
continue;
}
printf ("%d\n", interval (x, y));
}
}
int main()
{
freopen ("aib.in", "r", stdin);
freopen ("aib.out", "w", stdout);
citire();
return 0;
}