/**
* a template matrix (2d array), with a sample application - solving the ioi mobile problem.
*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef unsigned int uint;
template <class T> class matrix {
protected:
uint myRows, myCols;
vector<T> myData;
public:
matrix<T> () {}
matrix<T> (uint rows, uint cols):
myRows(rows), myCols(cols),
myData(rows*cols) {}
void resize (int rows, int cols) {
myRows=rows; myCols=cols;
myData.resize(rows*cols);
}
T& at(uint row, uint col) { return myData[row*myCols+col]; }
const T& at(uint row, uint col) const { return myData[row*myCols+col]; }
void fill (T value) { ::fill(myData.begin(), myData.end(), value); }
void print(ostream& out) const {
for (uint row=0; row<myRows; ++row) {
const T* temp = &myData[row*myCols];
for (uint col=0; col<myCols; ++col) {
out << temp[col] << " ";
}
out << endl;
}
}
friend ostream& operator<< (ostream& out, const matrix<T>& m) { m.print(out); return out; }
};
class MobileNetworkKeepsValues: public matrix<short> {
// myData[r,c] holds the number of phones in row r, column c
public:
void add(uint X, uint Y, short A) {
at(X,Y) += A;
}
uint sum(uint left, uint bottom, uint right, uint top) const {
uint result=0;
for (uint row=left; row<=right; ++row) {
const short* temp = &myData[row*myCols];
for (uint col=bottom; col<=top; ++col) {
result += temp[col];
}
}
return result;
}
};
class MobileNetworkKeepsSums: public matrix<int> {
// myData[r,c] holds the sum of phones in row r, columns [0..c]
public:
void add(uint X, uint Y, short A) {
int* temp = &myData[X*myCols];
for (uint col=Y; col<myCols; ++col) {
temp[col] += A;
}
}
uint sum(uint left, uint bottom, uint right, uint top) const {
uint result=0;
for (uint row=left; row<=right; ++row) {
// sum from bottom to top = sum from 0 to top - sum from 0 to (bottom-1)
result += (at(row,top)-(bottom>0? at(row,bottom-1): 0));
}
return result;
}
};
int main() {
MobileNetworkKeepsSums network;
char commandCode;
uint S, //for command 0
X,Y, // for command 1
L,B,R,T; // for command 2
short A; // for command 1
while (1) {
cin >> commandCode;
//cout << "command='" << commandCode << "'" << endl;
if (cin.eof()) break;
switch(commandCode) {
case '0':
cin >> S;
network.resize(S,S);
network.fill(0);
break;
case '1':
cin >> X >> Y >> A;
network.add(X,Y,A);
//network.print(cout);
break;
case '2':
cin >> L >> B >> R >> T;
cout << network.sum(L,B,R,T) << endl;
break;
case '3':
return 0;
default:
cerr << "Unknown command " << commandCode << endl;
}
}
}
LyoqCiAqIGEgdGVtcGxhdGUgbWF0cml4ICgyZCBhcnJheSksIHdpdGggYSBzYW1wbGUgYXBwbGljYXRpb24gLSBzb2x2aW5nIHRoZSBpb2kgbW9iaWxlIHByb2JsZW0uCiAqLwoKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDsKCnRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBtYXRyaXggewpwcm90ZWN0ZWQ6CiAgdWludCBteVJvd3MsIG15Q29sczsKICB2ZWN0b3I8VD4gbXlEYXRhOwpwdWJsaWM6CiAgbWF0cml4PFQ+ICgpIHt9CiAgbWF0cml4PFQ+ICh1aW50IHJvd3MsIHVpbnQgY29scyk6IAogICAgbXlSb3dzKHJvd3MpLCBteUNvbHMoY29scyksCiAgICBteURhdGEocm93cypjb2xzKSB7fSAKCiAgdm9pZCByZXNpemUgKGludCByb3dzLCBpbnQgY29scykgewogICAgbXlSb3dzPXJvd3M7IG15Q29scz1jb2xzOwogICAgbXlEYXRhLnJlc2l6ZShyb3dzKmNvbHMpOwogIH0KCiAgVCYgYXQodWludCByb3csIHVpbnQgY29sKSB7IHJldHVybiBteURhdGFbcm93Km15Q29scytjb2xdOyB9CiAgY29uc3QgVCYgYXQodWludCByb3csIHVpbnQgY29sKSBjb25zdCB7IHJldHVybiBteURhdGFbcm93Km15Q29scytjb2xdOyB9CgogIHZvaWQgZmlsbCAoVCB2YWx1ZSkgeyA6OmZpbGwobXlEYXRhLmJlZ2luKCksIG15RGF0YS5lbmQoKSwgdmFsdWUpOyB9CgogIHZvaWQgcHJpbnQob3N0cmVhbSYgb3V0KSBjb25zdCB7CiAgICBmb3IgKHVpbnQgcm93PTA7IHJvdzxteVJvd3M7ICsrcm93KSB7CiAgICAgIGNvbnN0IFQqIHRlbXAgPSAmbXlEYXRhW3JvdypteUNvbHNdOwogICAgICBmb3IgKHVpbnQgY29sPTA7IGNvbDxteUNvbHM7ICsrY29sKSB7CiAgICAgICAgb3V0IDw8IHRlbXBbY29sXSA8PCAiICI7CiAgICAgIH0KICAgICAgb3V0IDw8IGVuZGw7CiAgICB9CiAgfQoKICBmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3I8PCAob3N0cmVhbSYgb3V0LCBjb25zdCBtYXRyaXg8VD4mIG0pIHsgbS5wcmludChvdXQpOyByZXR1cm4gb3V0OyB9Cn07CgoKY2xhc3MgTW9iaWxlTmV0d29ya0tlZXBzVmFsdWVzOiBwdWJsaWMgbWF0cml4PHNob3J0PiB7CiAgLy8gbXlEYXRhW3IsY10gaG9sZHMgdGhlIG51bWJlciBvZiBwaG9uZXMgaW4gcm93IHIsIGNvbHVtbiBjCgpwdWJsaWM6CiAgdm9pZCBhZGQodWludCBYLCB1aW50IFksIHNob3J0IEEpIHsKICAgIGF0KFgsWSkgKz0gQTsKICB9CgogIHVpbnQgc3VtKHVpbnQgbGVmdCwgdWludCBib3R0b20sIHVpbnQgcmlnaHQsIHVpbnQgdG9wKSBjb25zdCB7CiAgICB1aW50IHJlc3VsdD0wOwogICAgZm9yICh1aW50IHJvdz1sZWZ0OyByb3c8PXJpZ2h0OyArK3JvdykgewogICAgICBjb25zdCBzaG9ydCogdGVtcCA9ICZteURhdGFbcm93Km15Q29sc107CiAgICAgIGZvciAodWludCBjb2w9Ym90dG9tOyBjb2w8PXRvcDsgKytjb2wpIHsKICAgICAgICByZXN1bHQgKz0gdGVtcFtjb2xdOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0gCgp9OwoKCmNsYXNzIE1vYmlsZU5ldHdvcmtLZWVwc1N1bXM6IHB1YmxpYyBtYXRyaXg8aW50PiB7CiAgLy8gbXlEYXRhW3IsY10gaG9sZHMgdGhlIHN1bSBvZiBwaG9uZXMgaW4gcm93IHIsIGNvbHVtbnMgWzAuLmNdCgpwdWJsaWM6CiAgdm9pZCBhZGQodWludCBYLCB1aW50IFksIHNob3J0IEEpIHsKICAgIGludCogdGVtcCA9ICZteURhdGFbWCpteUNvbHNdOwogICAgZm9yICh1aW50IGNvbD1ZOyBjb2w8bXlDb2xzOyArK2NvbCkgewogICAgICB0ZW1wW2NvbF0gKz0gQTsKICAgIH0KICB9CgogIHVpbnQgc3VtKHVpbnQgbGVmdCwgdWludCBib3R0b20sIHVpbnQgcmlnaHQsIHVpbnQgdG9wKSBjb25zdCB7CiAgICB1aW50IHJlc3VsdD0wOwogICAgZm9yICh1aW50IHJvdz1sZWZ0OyByb3c8PXJpZ2h0OyArK3JvdykgewogICAgICAvLyBzdW0gZnJvbSBib3R0b20gdG8gdG9wID0gc3VtIGZyb20gMCB0byB0b3AgLSBzdW0gZnJvbSAwIHRvIChib3R0b20tMSkKICAgICAgcmVzdWx0ICs9IChhdChyb3csdG9wKS0oYm90dG9tPjA/IGF0KHJvdyxib3R0b20tMSk6IDApKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfSAKfTsKCgppbnQgbWFpbigpIHsKICBNb2JpbGVOZXR3b3JrS2VlcHNTdW1zIG5ldHdvcms7CgogIGNoYXIgY29tbWFuZENvZGU7CiAgdWludCBTLCAvL2ZvciBjb21tYW5kIDAKICAgICAgIFgsWSwgLy8gZm9yIGNvbW1hbmQgMQogICAgICAgTCxCLFIsVDsgLy8gZm9yIGNvbW1hbmQgMgogIHNob3J0IEE7IC8vIGZvciBjb21tYW5kIDEKICAKICB3aGlsZSAoMSkgewogICAgY2luID4+IGNvbW1hbmRDb2RlOwogICAgLy9jb3V0IDw8ICJjb21tYW5kPSciIDw8IGNvbW1hbmRDb2RlIDw8ICInIiA8PCBlbmRsOwogICAgaWYgKGNpbi5lb2YoKSkgYnJlYWs7CiAgICBzd2l0Y2goY29tbWFuZENvZGUpIHsKICAgICAgY2FzZSAnMCc6CiAgICAgICAgY2luID4+ICBTOwogICAgICAgIG5ldHdvcmsucmVzaXplKFMsUyk7CiAgICAgICAgbmV0d29yay5maWxsKDApOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICcxJzoKICAgICAgICBjaW4gPj4gWCA+PiBZID4+IEE7CiAgICAgICAgbmV0d29yay5hZGQoWCxZLEEpOwogICAgICAgIC8vbmV0d29yay5wcmludChjb3V0KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnMic6CiAgICAgICAgY2luID4+IEwgPj4gQiA+PiBSID4+IFQ7CiAgICAgICAgY291dCA8PCBuZXR3b3JrLnN1bShMLEIsUixUKSA8PCBlbmRsOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICczJzoKICAgICAgICByZXR1cm4gMDsKICAgICAgZGVmYXVsdDoKICAgICAgICBjZXJyIDw8ICJVbmtub3duIGNvbW1hbmQgIiA8PCBjb21tYW5kQ29kZSA8PCBlbmRsOwogICAgfQogIH0KfQoKCg==