Pagini recente » Cod sursa (job #529887) | Cod sursa (job #1802167) | Clasament tema_lee | Istoria paginii runda/becreative21 | Cod sursa (job #3038663)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, v[100005], aib[100005], cer, x, y, nrq, pw2;
void update(int poz, int val)
{
for(int i = poz; i <= n; i += i & (-i))
aib[i] += val;
}
int sum(int poz)
{
int sum = 0;
for(int i = poz; i > 0; i -= i & (-i))
sum += aib[i];
return sum;
}
int findd(int cauta)
{
int ls = 1;
int ld = n;
while(ls <= ld)
{
int mij = (ls + ld) >> 1;
if(cauta == sum(mij))
{
return mij;
}
if(cauta > sum(mij))
{
ls = mij + 1;
}
else
{
ld = mij - 1;
}
}
return -1;
}
int main()
{
fin >> n >> nrq;
for(pw2 = 1; pw2 <= n; pw2 <<= 1);
pw2 >>= 1;
for(int i = 1; i <= n; ++ i)
{
fin >> v[i];
update(i, v[i]);
}
while(nrq--)
{
fin >> cer >> x;
if(cer == 0)
{
fin >> y;
update(x, y);
} else if(cer == 1) {
fin >> y;
fout << sum(y) - sum(x - 1) << '\n';
} else if(cer == 2) {
fout << findd(x) << '\n';
}
}
return 0;
}