Pagini recente » Cod sursa (job #2259060) | Cod sursa (job #2703793) | Cod sursa (job #2929371) | Cod sursa (job #2775267) | Cod sursa (job #3129023)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
const int NMax = 1e5+5;
int Aib[NMax], v[NMax], n;
ifstream in("aib.in");
ofstream out("aib.out");
int sum(int a, int index){
int sum = 0;
index = index+1;
a = a+1;
while(index>a){
sum += Aib[index];
index -= (index & -index);
}
return sum;
}
int sum1(int index){
int sum = 0;
index = index+1;
while(index>0){
sum += Aib[index];
index -= (index & -index);
}
return sum;
}
void upd(int index, int n, int val){
index = index+1;
while(index<=n){
Aib[index]+=val;
index += (index & -index);
}
}
void construct(int arr[], int n){
for(int i=1;i<=n;i++){
Aib[i] = 0;
}
for(int i=0;i<n;i++){
upd(i, n, arr[i]);
}
}
int search(int b, int y){
int st = 1, dr = n;
if(y==v[0]){
return 1;
}
while(st<dr){
int mid = (st+dr)/2;
int h = sum1(mid);
if(h<y){
st = mid+1;
dr = dr;
} else if(h>y){
st = st;
dr = mid;
} else if(h==y){
return mid+1;
}
}
return -1;
}
int main()
{
int x,y,z,k;
in >> n >> k;
for(int i=0;i<n;i++){
in >> v[i];
}
construct(v, n);
out << 1/2 << " ";
for(int i=1;i<=k;i++){
in >> x;
if(x==0){
in >> y >> z;
upd(y, n, z);
} else if (x==1) {
in >> y >> z;
out << sum(y, z) << "\n";
} else if(x==2){
in >> y;
out << search(n, y) << "\n";
}
}
}