Pagini recente » Cod sursa (job #2384328) | Cod sursa (job #443359) | Cod sursa (job #1892964) | Cod sursa (job #1731145) | Cod sursa (job #528836)
Cod sursa(job #528836)
// http://infoarena.ro/problema/datorii
// rezolvata cu arbori indexati binar (http://infoarena.ro/aib)
#include <fstream>
using namespace std;
#define maxDays 15002
#define zeros(x) ( (x ^ (x - 1)) & x )
ifstream in("datorii.in");
ofstream out("datorii.out");
int days;
int AIB[maxDays];
void add(int location,int value); // aduna la pozitia location valoarea value
int query(int right); // returneaza suma elementelor subsecventei [1,right];
int main() {
int operations,value;
int first,second;
bool interogation;
in >> days >> operations;
for(int currentDay=1;currentDay<=days;currentDay++) {
in >> value;
add(currentDay,value);
}
for(int i=1;i<=operations;i++) {
in >> interogation >> first >> second;
if(interogation)
out << query(second) - query(first-1) << "\n"; // suma elementelor din intervalul [first,second]
else
add(first,-second);
}
return (0);
}
void add(int location,int value) {
for(int k=location;k<=days;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;
}