Pagini recente » Cod sursa (job #2190022) | Cod sursa (job #2772527) | Cod sursa (job #2864649) | Cod sursa (job #260928) | Cod sursa (job #1217594)
#include <fstream>
using namespace std;
int N,M,k, tree[200100], pos,val,sum,ql,qr;
/*void build_tree(int nod, int l, int r){
if (l==r){
tree[nod]=a[l];
return;
}
int mid=(l+r)>>1;
build_tree(nod<<1,l,mid);
build_tree((nod<<1)+1,mid+1,r);
tree[nod]=tree[nod<<1]+tree[(nod<<1)+1];
}*/
void inc(int nod, int l, int r){
if (l==r){
tree[nod]+=val;
return;
}
int mid=(l+r)>>1;
if (pos<=mid)
inc(nod<<1,l,mid);
else
inc((nod<<1)+1,mid+1,r);
tree[nod]=tree[nod<<1]+tree[(nod<<1)+1];
}
void query(int nod, int l, int r){
if (ql<=l && r<=qr){
sum+=tree[nod];
return;
}
int mid=(l+r)>>1;
if (ql<=mid)
query(nod<<1,l,mid);
if (mid<qr)
query((nod<<1)+1,mid+1,r);
}
void get_k(int suma){
int l=1, r=N;
ql=1;
while (l<r){
qr=(l+r)>>1;
sum=0;
query(1,1,N);
if (sum>suma)
r=qr-1;
else if (sum<suma)
l=qr+1;
else {
l=qr;
break;
}
}
k=l;
qr=l; sum=0;
query(1,1,N);
if (sum!=suma)
k=-1;
}
int main(){
ifstream in("aib.in");
ofstream out("aib.out");
in >> N >> M;
int i,op;
for (i=1; i<=N; i++){
in >> val;
pos=i;
inc(1,1,N);
}
for (i=1; i<=M; i++){
in >> op;
if (op==0){
in >> pos >> val;
inc(1,1,N);
}
else if (op==1){
in >> ql >> qr;
sum=0;
query(1,1,N);
out << sum << "\n";
}
else {
in >> val;
get_k(val);
out << k << "\n";
}
}
return 0;
}