Pagini recente » Borderou de evaluare (job #2458777) | Atasamentele paginii Profil victor_mn | Monitorul de evaluare | Borderou de evaluare (job #2606564) | Cod sursa (job #528862)
Cod sursa(job #528862)
// http://infoarena.ro/problema/aib
#include <fstream>
using namespace std;
#define maxSize 100002
#define zeros(x) ( (x ^ (x - 1)) & x )
ifstream in("aib.in");
ofstream out("aib.out");
int lenght;
int AIB[maxSize];
void add(int location,int value);
int findMinPosition(int sum);
int query(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: //out << findMinPosition(first) << "\n";
out << "-1\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 findMinPosition(int sum) {
for(int position=1;position<=lenght;position++)
if(query(position) == sum)
return position;
return -1; // daca nu se gaseste subsecventa cu suma ceruta
}