Pagini recente » Cod sursa (job #1003892) | Cod sursa (job #730927) | Cod sursa (job #294026) | Cod sursa (job #1787824) | Cod sursa (job #528896)
Cod sursa(job #528896)
// 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 lenght;
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 nrOperations,value;
int first,second;
bool interogation;
in >> lenght >> nrOperations;
for(int currentDay=1;currentDay<=lenght;currentDay++) {
in >> value;
add(currentDay,value);
}
for(int i=1;i<=nrOperations;i++) {
in >> interogation >> first >> second;
if(interogation)
out << query(second) - query(first-1) << "\n"; // suma elementelor din intervalul [first,second]
else
add(first,-second);
}
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;
}