Pagini recente » Cod sursa (job #3124369) | Cod sursa (job #2584884) | Cod sursa (job #869332) | Cod sursa (job #368191) | Cod sursa (job #2575388)
#include <bits/stdc++.h>
#define lung(x) ( (x^(x- 1)) & x )
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int aib[132000];
int n, m;
void Update(int poz,int val)
{
for(int i = poz; i <= 100000; i += lung(i))
aib[i] += val;
}
int Query(int poz)
{
int answer = 0;
for(int i = poz; i >= 1; i -= lung(i))
answer += aib[i];
return answer;
}
int BinSearch(int val)
{
int suma = 0;
int raspuns = 0;
int FinalAnswer = 1e9;
for(int i = 16; i >= 0; i --)
{
//cout << suma << " " << raspuns << " " << raspuns + (1 << i) << " " << aib[raspuns + (1 << i)] <<" " << val << "\n";
if(suma + aib[raspuns + (1 << i)] < val)
{
suma += aib[raspuns + (1 << i)];
raspuns += (1 << i);
}
else if(suma + aib[raspuns + (1 << i)] == val)
{
FinalAnswer = min(FinalAnswer, raspuns + (1 << i));
}
}
if(FinalAnswer == 1e9)
return -1;
return FinalAnswer;
}
int main()
{
int a, b, op, x;
fin >> n >> m;
for(int i = 1; i <= n; i++)
{
fin >> x;
Update(i, x);
}
for(int i = 1 ; i <= m; i++)
{
fin >> op;
if(op == 0)
{
fin >> a >> b;
Update(a, b);
}
else if(op == 1)
{
fin >> a >> b;
fout << Query(b) - Query(a - 1) << "\n";
}
else
{
fin >> a;
fout << BinSearch(a) <<"\n";
}
}
return 0;
}