Pagini recente » Cod sursa (job #3127485) | Cod sursa (job #2161059) | Cod sursa (job #369579) | Cod sursa (job #2626657) | Cod sursa (job #1889177)
#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 cobor(int index,int k){
for (int i=1;i<=index;i++) if (aib[i]==k) return i;
return -1;
}
int binarysearch(int st,int dr,int val){
int mid=(st+dr)/2;
int sum=getsum(mid);
if (st==dr){
if (sum==val) return mid;
else return -1;
}
if (sum<val) binarysearch(mid+1,dr,val);
else if (sum>val)binarysearch(st,mid-1,val);
else if (sum==val) return mid;
}
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;
}