Pagini recente » Cod sursa (job #2647783) | Cod sursa (job #2913319) | Cod sursa (job #1550658) | Cod sursa (job #2148018) | Cod sursa (job #1761197)
#include <cstdio>
using namespace std;
int m;
class ArboreIndexatBinar
{
private:
int n;
int aib[100010];
int gasirePutere(int x)
{
return ((x ^ (x - 1)) & x);
}
int sum(int x)
{
int sum = 0;
for(int i = x; i >= 1; i -= gasirePutere(i))
{
sum += aib[i];
}
return sum;
}
public:
void citire()
{
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++)
{
int tmp;
scanf("%d", &tmp);
for(int j = i; j <= n; j += gasirePutere(j))
{
aib[j] += tmp;
}
}
}
void incrementare(int pos, int val)
{
for(int j = pos; j <= n; j += gasirePutere(j))
{
aib[j] += val;
}
}
int gasireSuma(int sumaCautata)
{
int st, dr, mij;
int sumaPartiala = 0;
st = 1;
dr = n;
while(st <= dr)
{
mij = (st + dr) / 2;
sumaPartiala = sum(mij);
if(sumaCautata == sumaPartiala)
{
return mij;
}
else if(sumaPartiala > sumaCautata)
{
dr = mij - 1;
}
else
{
st = mij + 1;
}
}
return -1;
}
int querry(int x, int y)
{
return sum(y) - sum(x - 1);
}
ArboreIndexatBinar()
{
for(int i = 0; i < 100010; i++)
{
aib[i] = 0;
}
}
};
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
ArboreIndexatBinar aib;
aib.citire();
int opt;
int par1, par2;
for(int i = 0; i < m; i++)
{
scanf("%d", &opt);
switch(opt)
{
case 0:
scanf("%d %d", &par1, &par2);
aib.incrementare(par1, par2);
break;
case 1:
scanf("%d %d", &par1, &par2);
printf("%d\n", aib.querry(par1, par2));
break;
case 2:
scanf("%d", &par1);
printf("%d\n", aib.gasireSuma(par1));
break;
}
}
return 0;
}