Pagini recente » Cod sursa (job #247603) | Cod sursa (job #2837292) | Cod sursa (job #1314160) | Cod sursa (job #2507213) | Cod sursa (job #2117119)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
const int Nmax = 100005;
int aib[Nmax], n, Q;
inline void Update(int poz, int val)
{
while(poz <= n)
{
aib[poz] += val;
poz += (poz & ( - poz)); /// poz & (- poz ) - > 2 ^ numarul
/// de biti de 0 cu care se termina
/// valoarea poz in baza 2
}
}
inline int Sum(int poz)
{
int sum = 0;
while(poz >= 1)
{
sum += aib[poz];
poz -= (poz & ( - poz));
}
return sum;
}
inline int Binary_Search(int x)
{
int st = 1 , dr = n , mij , poz = -1;
while(st <= dr)
{
mij = (st + dr) / 2;
if(Sum(mij) == x)
{
poz = mij;
dr = mij - 1;
}
else if(Sum(mij) > x)
dr = mij - 1;
else st = mij + 1;
}
return poz;
}
int main()
{
int x , op , y;
fin >> n >> Q;
for(int i = 1 ; i <= n ; i++)
{
fin >> x;
Update(i , x);
}
while(Q -- )
{
fin >> op;
if(op == 0)
{
fin >> x >> y;
Update(x , y);
}
else if(op == 1)
{
fin >> x >> y;
fout << Sum(y) - Sum(x - 1) << "\n";
}
else
{
fin >> x;
fout << Binary_Search(x) << "\n";
}
}
fin.close();
fout.close();
return 0;
}