Pagini recente » Cod sursa (job #2439132) | Cod sursa (job #1211222) | Cod sursa (job #494816) | Cod sursa (job #2849955) | Cod sursa (job #1889241)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int N,M,aib[100010];
int parent(int x){
return x-(x&(~x)+1);
}
int next(int x){
return x+(x&(~x)+1);
}
bool inrange(int x){
return x<=N;
}
void update(int index,int val){
if (inrange(index)){
aib[index]+=val;
update(next(index),val);
}
else return;
}
int getsum(int x){
if (x){
return aib[x]+getsum(parent(x));
}
else return 0;
}
int binarysearch(int st,int dr,int val){
int mid;
while (st<=dr){
mid=(st+dr)/2;
if (getsum(mid)>val)dr=mid-1;
else st=mid+1;
}
if (!dr) return -1;
if (getsum(dr)==val) return dr;
else return -1;
}
void caz1(){
int x,y;
fin >>x>>y;
update(x,y);
}
void caz2(){
int x,y;
fin >>x>>y;
fout <<getsum(y)-getsum(x-1)<<"\n";
}
void caz3(){
int x;
fin >>x;
int index=binarysearch(1,N,x);
fout <<index<<"\n";
}
int main(){
fin >>N>>M;
for (int i=0;i<N;i++){
int x;
fin >>x;
update(i+1,x);
}
while (M--){
short x;
fin>>x;
switch(x){
case 0:caz1();break;
case 1:caz2();break;
case 2:caz3();break;
}
}
return 0;
}