Pagini recente » Cod sursa (job #562902) | Cod sursa (job #925309) | Cod sursa (job #110518) | Cod sursa (job #1426160) | Cod sursa (job #1478272)
#include <bits/stdc++.h>
using namespace std;
const char iname[] = "aib.in";
const char oname[] = "aib.out";
const char eval[] = "E:/Downloads/grader_test2 (1).ok";
const int MAXN = 100005;
void check();
int n, m, tree[MAXN];
void add(int index, int val){
while(index <= n){
tree[index] += val;
index += (index & (-index));
}
}
int getSum(int index){
int sum = 0;
while(index > 0){
sum += tree[index];
index -= (index & (-index));
}
return sum;
}
void read(){
freopen(iname, "r", stdin);
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; ++i){
int aux;
scanf("%d", &aux);
add(i, aux);
}
}
int find(int val){
if(val == 0) return -1;
int index = 0;
int bitmask = 1;
while(bitmask <= n) bitmask <<= 1;
bitmask >>=1;
while((bitmask) && (index < n)){
int tIndex = index + bitmask;
if(tIndex <= n){
if(val == tree[tIndex]) {
if(tIndex == 0){
printf("%d\n", val);
}
return tIndex;
}
else if(val > tree[tIndex]){
index += bitmask;
val -= tree[tIndex];
}}
bitmask >>=1;
}
if(val != 0)
return -1;
else
return index;
}
void solve(){
FILE *out = fopen(oname, "w");
for(int i = 0; i < m; ++i){
int c, a, b;
scanf("%d", &c);
if(c == 2){
scanf("%d", &a);
fprintf(out,"%d\n", find(a));
}
else{
scanf("%d %d", &a, &b);
if(c == 0) add(a, b);
if(c == 1) {
fprintf(out,"%d\n", getSum(b) - getSum(a-1));
}
}
}
}
int main()
{
read();
solve();
return 0;
}