Pagini recente » Cod sursa (job #3195733) | Cod sursa (job #2266111) | Cod sursa (job #1071920) | Cod sursa (job #139103) | Cod sursa (job #2698370)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("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;
}
int query(int poz)
{
int sum = 0;
for(int i=poz; i>0; i -= (i&(-i)))
sum += aib[i];
return 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;
in>>n>>m;
for(int i=1; i<=n; i++)
{
in>>a;
for(int j=i; j<=n; j += (j&(-j)))
aib[j] += a;
}
while(m--)
{
in>>op;
if(op == 0) //valorii elem de pe poz a se adauga valoarea b
{
in>>a>>b;
add(a, b);
}
else if(op == 1) //sa se det suma (a , b)
{
in>>a>>b;
out<<query(b) - query(a-1)<<'\n';
}
else if(op == 2) //poz minima k astfel incat suma de la 1 la k ii a
{
in>>a;
out<<pozMin(a)<<'\n';
}
}
return 0;
}