Pagini recente » Cod sursa (job #860200) | Cod sursa (job #873604) | Cod sursa (job #1000890) | Cod sursa (job #315970) | Cod sursa (job #395035)
Cod sursa(job #395035)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
vector<int> suma;
void adauga(int i,int n,int max){
while(i<=max){
suma[i]+=n;
i+=(i&(-i));
}
}
int sum(int i){
int n=0;
while(i>0){
n+=suma[i];
i-=(i&(-i));
}
return n;
}
int minim(int a,int max){
int i=0;
int p=1;
while(p<=max)p*=2;
p/=2;
while(i<=max and p){
int mid=i+p;
if(suma[mid]==a) return mid;
else if(suma[mid]<a){
i=mid;
a-=suma[mid];
}
p/=2;
}
if(a) return -1;
else return i;
}
int main(){
ifstream in("aib.in");
ofstream out("aib.out");
int n,m;
in>>n>>m;suma=vector<int>(n+1,0);
for(int i=0;i<n;i++){
int temp;
in>>temp;
adauga(i+1,temp,n);
}
for(int i=0;i<m;i++){
int c;
in>>c;
switch(c){
int a,b;
case 0:
in>>a>>b;
adauga(a,b,n);
break;
case 1:
in>>a>>b;
out<<sum(b)-sum(a-1)<<"\n";
break;
case 2:
in>>a;
out<<minim(a,n)<<"\n";
break;
}
}
}