Pagini recente » Cod sursa (job #4473) | Cod sursa (job #2835599) | Cod sursa (job #1461963) | Cod sursa (job #2670959) | Cod sursa (job #929264)
Cod sursa(job #929264)
#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;
void add(int a, int b, short c[]);
int getSum(int a, int b, short c[]);
int position(int a, short c[], int n);
int main(){
int n, n1,m;
ifstream cinr("aib.in");
cinr >> n1 >> m;
n=1<<int(log(n1-1)/log(2)+1);
short v[2*n];
for(int i=0; i<n1; i++) cinr >> v[n+i];
for(int i=n+n1; i<2*n; i++) v[i]=0;
for(int i=n-1; i>0; i--) v[i]=v[2*i]+v[2*i+1];
ofstream cour("aib.out");
for(int i=0; i<m; i++){
int x,y,z; cinr >> x >> y;
if(x==0){
cinr >> z;
add(z, y+n-1, v);
}
if(x==1){
cinr >> z;
cour << getSum(y+n-1, z+n-1, v) << "\n";
}
if(x==2){
cour << position(y, v, n) << "\n";
}
}
cinr.close(); cour.close();
}
void add(int a, int b, short c[]){
while(b>0){
c[b]+=a;
b/=2;
}
}
int getSum(int a, int b, short c[]){
int sum=0;
while(a<=b){
if(a%2==1) sum+=c[a];
if(b%2==0) sum+=c[b];
a=(a+1)/2;
b=(b-1)/2;
}
return sum;
}
int position(int a, short c[], int n){
int p=1;
while(p<n){
if(c[p]==a) break;
if(c[2*p]<a){
a-=c[2*p];
p=2*p+1;
}
else p*=2;
}
if(c[p]>a || c[p]<a) return(-1);
while(p<n) p=2*p+1; return p-n+1;
}