Pagini recente » Cod sursa (job #574564) | Cod sursa (job #1444992) | Rating Marginean Sebastian Adrian (ViiRalL) | Istoria paginii utilizator/stay_awake77 | Cod sursa (job #1223089)
#include <fstream>
using namespace std;
int i,n,m,st,dr,a,b,mid,q,x;
int v[100005];
int ub(int x) {
return (x&(-x));
}
void update(int i, int val) {
for(;i<=n;i+=ub(i))
v[i]+=val;
}
int query1(int i) {
int rez=0;
for(;i;i-=ub(i))
rez+=v[i];
return rez;
}
int query2(int val) {
st=1;
dr=n;
while(st<=dr) {
mid=(st+dr)/2;
if(query1(mid)>=val)
dr=mid-1;
else
st=mid+1;
}
if(val==query1(st))
return st;
return -1;
}
int main() {
ifstream f("aib.in");
ofstream g("aib.out");
f>>n>>m;
for(i=1;i<=n;i++) {
f>>x;
update(i,x);
}
for(i=1;i<=m;i++) {
f>>q;
if(q==0) {
f>>a>>b;
update(a,b);
}
else
if(q==1) {
f>>a>>b;
g<<query1(b)-query1(a-1)<<"\n";
}
else {
f>>a;
g<<query2(a)<<"\n";
}
}
return 0;
}