Pagini recente » Cod sursa (job #3195) | Cod sursa (job #510434) | Cod sursa (job #2958677) | Cod sursa (job #870502) | Cod sursa (job #2696637)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define limn 100010
int aib[limn];
int n, m;
void add(int poz, int val)
{
for(int i=poz; i<=n; i += (i&(-i)))
aib[i] += val;
}
/// returneaza suma de la 1 la poz
int query(int poz)
{
int sum = 0;
for(int i=poz; i>0; i -= (i&(-i)))
sum += aib[i];
return sum;
}
///poz minima poz astfel incat suma de la 1 la poz este sum
int pozMin(int sum)
{
int mask, pos;
for(mask = 1; mask<=n; mask<<=1);
mask>>=1;
pos = 0;
for(; mask; mask>>=1)
if(pos + mask <= n)
if(aib[pos+mask] <= sum)
{
pos += mask;
sum -= aib[pos];
if(sum == 0)
return pos;
}
return -1;
}
int main()
{
int op, a, b;
fin>>n>>m;
for(int i=1; i<=n; i++)
{
fin>>a;
for(int j=i; j<=n; j += (j&(-j)))
aib[j] += a;
}
while(m--)
{
fin>>op;
if(op == 0) //valorii elem de pe poz a se adauga valoarea b
{
fin>>a>>b;
add(a, b);
}
else if(op == 1) //sa se det suma (a , b)
{
fin>>a>>b;
fout<<query(b) - query(a-1)<<'\n';
}
else if(op == 2) //poz minima k astfel incat suma de la 1 la k ii a
{
fin>>a;
fout<<pozMin(a)<<'\n';
}
}
return 0;
}