Pagini recente » Cod sursa (job #1408631) | Cod sursa (job #177993) | Cod sursa (job #1667693) | Cod sursa (job #2203238) | Cod sursa (job #3039683)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int nmax = 100003;
int n, m, v[nmax];
unsigned int sumPart[nmax];
void read(void);
void solveSumPart(void);
int binSearch(int left, int right, int valCautat);
int main(){
read();
solveSumPart();
fin.close();
//fout.close();
}
void read(void){
int i;
fin>>n>>m;
for(i = 1; i <= n; i++){
fin>>v[i];
sumPart[i] = sumPart[i - 1] + v[i];
}
}
void solveSumPart(void){
int x, y, z, i;
//cout<<"here\n";
while(m--){
//cout<<"m = "<<m<<"\n";
fin>>x;
switch(x){
case 0:
//cout<<"case0\n";
fin>>y>>z;
v[y] += z;
for(i = y; i <= n; i++)
sumPart[i] += z;
break;
case 1:
//cout<<"case1\n";
fin>>y>>z;
fout<<sumPart[z] - sumPart[y - 1]<<"\n";
break;
case 2:
//cout<<"case2\n";
fin>>y;
z = binSearch(1, n, y);
//cout<<z<<"\n";
fout<<z<<"\n";
break;
default:
break;
}
//cout<<"m = "<<m<<"\n";
}
//cout<<"end\n";
}
int binSearch(int left, int right, int valCautat){
//fout<<"left = "<<left<<", right = "<<right<<"\n";
if(left == right && valCautat == sumPart[left])
return left;
else if(left == right)
return -1;
int mid = (left + right) / 2;
int val = binSearch(left, mid, valCautat);
if(val != -1)
return val;
else return binSearch(mid + 1, right, valCautat);
}