Pagini recente » Cod sursa (job #1436510) | Cod sursa (job #3232733) | Cod sursa (job #2412075) | Cod sursa (job #259185) | Cod sursa (job #2031310)
#include<fstream>
#define AIB_SIZE 100000
using namespace std;
int aib[AIB_SIZE+1], n, m;
inline void updateAIB(int val, int pos) {
do {
aib[pos] += val;
pos += pos & (-pos);
}while(pos <= n);
}
inline int sum(int x) {
int suma = 0;
while(x) {
suma += aib[x];
x &= x-1;
}
return suma;
}
inline int binarySearch(int val) {
int left, right, mid, pos, suma;
left = 1; right = n; pos = -1;
while(left <= right && pos == -1)
{
mid = (left + right) >> 1;
suma = sum(mid);
if(suma == val)
pos = mid;
else if(val < suma)
right = mid - 1;
else left = mid + 1;
}
return pos;
}
int main() {
int i, op, x, y;
ifstream fin("aib.in");
ofstream fout("aib.out");
fin >> n >> m;
for(i=1; i<=n; i++) {
fin >> x;
updateAIB(x,i);
}
for(i=1; i<=m; i++) {
fin >> op >> x;
if(op == 0 || op == 1)
fin >> y;
switch(op) {
case 0 : updateAIB(y,x); break;
case 1 : fout << sum(y) - sum(x-1) << "\n"; break;
case 2 : fout << binarySearch(x) << "\n"; break;
}
}
fin.close();
fout.close();
return 0;
}