Pagini recente » Cod sursa (job #2179515) | Cod sursa (job #2939201) | Cod sursa (job #3163601) | Cod sursa (job #164402) | Cod sursa (job #853538)
Cod sursa(job #853538)
#include<fstream>
#include<cmath>
#define zeros(x) ( (x ^ (x - 1)) & x )
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int aib[100005], N, M;
void add(int index, int val){
int i;
/*
int poz = 0;
while(index <= N){
aib[index] += val;
while( (index & (int)pow((double)2,poz)) == 0 ) ++poz;
index += (int)pow((double)2,poz);
++poz;
}//end of while
*/
for (i = index; i <= N; i += zeros(i))
aib[i] += val;
//fout << "aib: ";
//for(i = 1; i <= N; ++i) fout << aib[i] << ", ";
//fout << "\n";
}//end of add(index, val)
int suma(int x){ // calculeaza suma de la 1 la x (indecsi)
int i, sol = 0;
for (i = x; i > 0; i -= zeros(i))
sol += aib[i];
return sol;
}//end of suma
int search(int sum)
{
int mj, st = 1, dr = N;
while(st < dr){
mj = (st + dr) / 2;
if(suma(mj) < sum) st = mj + 1;
else dr = mj;
}
return suma(st) == sum ? st : -1;
}
int main (){
fin >> N >> M; // N elemente, M operatii
int i,j,x;
for(i = 1; i <= N; ++i){
fin >> x; // am bagat arborele
add(i,x);
}
int cod, sum, a, b, index, val, temp;
//int poz = 0; // pozitia celui mai nesemnificativ bit cu valoarea 1
for(i = 1; i <= M; ++i){
fin >> cod;
if(cod == 0){
fin >> index >> val;
add(index, val);
}//end of if cod == 0
else if(cod == 1){
fin >> a >> b;
fout << (suma(b) - suma(a-1)) << "\n";
}//end of if cod == 1
else if(cod == 2){
fin >> sum;
fout << search(sum) << "\n";
}//end of if cod == 2
}//end of for i = 1 -> M
return 0;
}