Pagini recente » Cod sursa (job #1918955) | Monitorul de evaluare | Monitorul de evaluare | Borderou de evaluare (job #1535616) | Cod sursa (job #528889)
Cod sursa(job #528889)
// http://infoarena.ro/problema/aib
#include <fstream>
#include <algorithm>
using namespace std;
#define maxSize 100002
#define zeros(x) ( (x ^ (x - 1)) & x )
ifstream in("aib.in");
ofstream out("aib.out");
int lenght,toBeFound;
int AIB[maxSize];
void add(int location,int value);
int query(int right);
int search(int left,int right);
int main() {
int nrOperations,value;
int operationType,first,second;
in >> lenght >> nrOperations;
for(int i=1;i<=lenght;i++) {
in >> value;
add(i,value);
}
for(int i=1;i<=nrOperations;i++) {
in >> operationType >> first;
switch(operationType) {
case 0:
in >> second;
add(first,second);
break;
case 1:
in >> second;
out << query(second) - query(first-1) << "\n";
break;
case 2:
toBeFound = first;
out << search(1,lenght) << "\n";
break;
}
}
in.close();
out.close();
return (0);
}
void add(int location,int value) {
for(int k=location;k<=lenght;k=k+zeros(k))
AIB[k] = AIB[k] + value;
}
int query(int right) {
int value = 0;
for(int k=right;k>0;k=k-zeros(k))
value = value + AIB[k];
return value;
}
int search(int left,int right) {
if(left > right)
return -1;
else {
int middle = (left + right) / 2;
int answer = query(middle);
if(answer == toBeFound)
return middle;
else
if(answer < toBeFound)
return search(middle+1,right);
else
return search(left,middle-1);
}
}