Pagini recente » Cod sursa (job #750263) | Cod sursa (job #717825) | Cod sursa (job #396321) | Cod sursa (job #1891344) | Cod sursa (job #2392166)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n, m, array[150000], aib[150000], gp2;
void generate(){
for (int i = 1; i <= n; ++i) {
for (int j = i; j <= gp2; j = (j + (j & (-j)))) {
aib[j] += array[i];
}
}
}
void query(int a, int b){
array[a] += b;
for (int i = a; i <= gp2; i = (i + (i & (-i)))) {
aib[i] += b;
}
}
int request(int a, int b){
int sum = 0;
--a;
for (; b; b = b - (b & (-b))) {
sum+= aib[b];
}
for (; a; a = a - (a & (-a))) {
sum-= aib[a];
}
return sum;
}
int search(int a){
int sum = 0, pos = 0;
for (int i = 1; sum < a; i = (i + (i & (-i)))) {
sum = aib[i];
pos = i;
}
while(sum > a)
sum -= array[pos--];
if(sum == a)
return pos;
return -1;
}
int main() {
f>>n>>m;
for (int i = 1; i <= n; ++i) {
f>>array[i];
}
gp2 = 1;
while(gp2<n)
gp2 = (gp2 << 1);
generate();
// for (int j = 1; j <= gp2; ++j) {
// cout<<aib[j]<<' ';
// }
for (int i = 0; i < m; ++i) {
int type, a;
f>>type>>a;
switch(type){
case 0: {
int b;
f>>b;
query(a, b);
break;
}
case 1: {
int b;
f>>b;
cout<<request(a, b)<<"\n";
break;
}
case 2: {
cout<<search(a)<<"\n";
break;
}
default: break;
}
}
f.close();
g.close();
return 0;
}