Pagini recente » Cod sursa (job #235377) | Cod sursa (job #3274618) | Cod sursa (job #1829297) | Cod sursa (job #170716) | Cod sursa (job #1793291)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
typedef unsigned int uint;
int n,m;
vector<int> arbore;
inline uint getParent(uint queriedNode){
unsigned int aux = ~queriedNode+1;
aux = queriedNode&aux;
return queriedNode-aux;
}
inline uint getNext(uint queriedNode){
unsigned int aux = ~queriedNode+1;
aux = queriedNode&aux;
return queriedNode+aux;
}
void update(int poz, int val){
while(poz<=n){
arbore[poz]+=val;
poz=getNext(poz);
}
}
uint query(int poz){
uint sum=0;
while(poz>0){
sum+=arbore[poz];
poz=getParent(poz);
}
return sum;
}
int binSearch(int sumToFind){
int m,left=1,right=n,best=-1;
while(left<=right){
int m=(left+right)/2;
int aux=query(m);
if(aux==sumToFind){
best=m;
right=m-1;
}
else if(aux<sumToFind)left=m+1;
else right=m-1;
}
return best;
}
int main()
{
int x,y,caz;
fin>>n>>m;
arbore.resize(n+1);
for(int i = 1;i<=n;i+=1){fin>>x;update(i,x);}
for(;m;m-=1){
fin>>caz;
switch(caz){
case 0:
fin>>x>>y;
update(x,y);
break;
case 1:
fin>>x>>y;
fout<<query(y)-query(x-1)<<'\n';
break;
case 2:
fin>>x;
fout<<binSearch(x)<<'\n';
}
}
}