Pagini recente » Cod sursa (job #2104462) | Cod sursa (job #601028) | Cod sursa (job #351885) | Cod sursa (job #32819) | Cod sursa (job #2144961)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
const int Nmax = 100005;
int aib[Nmax] , n;
/// aib[i] - suma elementelor din intervalul [i - 2 ^ p + 1 , i]
/// p - nr de biti de 0 in care se termina numarul i
inline void UPDATE(int poz , int x)
{
while(poz <= n)
{
aib[poz] += x;
poz += (poz & ( - poz));
}
}
inline int Sum(int poz)
{
int s = 0;
while(poz >= 1)
{
s += aib[poz];
poz -= (poz & ( - poz));
}
return s;
}
inline void Binary_Search(int x)
{
int stg = 1 , drp = n , poz = - 1 , mij , s;
while(stg <= drp)
{
mij = (stg + drp) / 2;
s = Sum(mij);
if(s == x)
{
poz = mij;
drp = mij - 1;
}
else if(s < x)
stg = mij + 1;
else drp = mij - 1;
}
fout << poz << "\n";
}
int main()
{
int x , Q , op , y;
fin >> n >> Q;
for(int i = 1 ; i <= n ; i++)
{
fin >> x;
UPDATE(i , x);
}
while(Q -- )
{
fin >> op >> x;
if(op == 0)
{
fin >> y;
UPDATE(x , y);
}
else if(op == 1)
{
fin >> y;
fout << Sum(y) - Sum(x - 1) << "\n";
}
else
Binary_Search(x);
}
fin.close();
fout.close();
return 0;
}