Pagini recente » Cod sursa (job #1762581) | Cod sursa (job #2406441) | Cod sursa (job #2494005) | Cod sursa (job #671885) | Cod sursa (job #1763908)
#include <stdio.h>
using namespace std;
int n,m , arbori[100100];
class arbori_indexati_binar
{
public:
void creat(int i , int x);
int sume(int x , int y);
int sume2(int y);
int searched(int k);
};
int arbori_indexati_binar::sume2(int y)
{
int sume = 0;
for(y ; y > 0 ; y -= (y^(y-1))&y)
sume += arbori[y];
return sume;
}
int arbori_indexati_binar::searched(int k)
{
int left = 1;
int right = n;
while(left <= right)
{
int middle = (left + right)/2;
int sume_now = sume2(middle);
if(sume_now == k)
return middle;
if(sume_now < k)
left = middle+1;
else
right = middle;
}
return -1;
}
void arbori_indexati_binar::creat(int i , int x)
{
for(int j =i; j <= n ; j+=(j^(j-1))&j)
arbori[j] += x;
}
int arbori_indexati_binar::sume(int x , int y)
{
int suma = 0;
for(y; y > 0 ; y -=(y^(y-1))&y)
suma += arbori[y];
int dif = 0;
for(x = x - 1; x > 0 ; x -=(x^(x-1))&x)
dif += arbori[x];
return suma - dif;
}
void read()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
arbori_indexati_binar object;
int nr=0;
for(int i = 0 ; i < n ; i++)
{
scanf("%d ",&nr);
object.creat(i+1,nr);
}
for(int i = 0 ; i < m ; i++)
{
int task,a,b;
scanf("%d",&task);
if(task == 1)
{
scanf("%d %d",&a,&b);
printf("%d\n",object.sume(a,b));
}
if(task == 2)
{
scanf("%d",&a);
printf("%d\n",object.searched(a));
}
if(task == 0)
{
scanf("%d %d",&a,&b);
object.creat(a,b);
}
}
}
int main()
{
read();
return 0;
}