Cod sursa(job #2009273)

Utilizator MaligMamaliga cu smantana Malig Data 9 august 2017 09:04:52
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.86 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream in("batog2d.in");
ofstream out("batog2d.out");

#define ll long long
#define ull unsigned long long
#define pb push_back
const int NMax = 1e5 + 5;
const int sqMax = 320;

int N,M;
int a[NMax][NMax],hBit[NMax][sqMax],vBit[sqMax][NMax],sqBit[sqMax][sqMax]
    hAdd[NMax][sqMax],vAdd[sqMax][NMax],sqAdd[sqMax][sqMax];

void update(int,int,int,int,int);
void hUpdate(int,int,int,int,int);
void vUpdate(int,int,int,int,int);
void sqUpdate(int,int,int,int,int);
int query(int,int,int,int);
int hQuery(int,int,int,int);
int vQuery(int,int,int,int);
int sqQuery(int,int,int,int);

int main() {
    in>>N>>M;

    int root = 1;
    while (root*root <= N) {
        ++root;
    }
    --root;

    for (int i=1;i <= N;++i) {
        for (int j=1;j <= N;++j) {
            in>>a[i][j];

            int idx = (i-1)/root + 1,
                jdx = (j-1)/root + 1;
            hBit[i][jdx] = max(hBit[i][jdx],a[i][j]);
            vBit[idx][j] = max(vBit[idx][j],a[i][j]);
            sqBit[idx][jdx] = max(sqBit[idx][jdx],a[i][j]);
        }
    }

    while (M--) {
        char tip;
        int x1,y1,x2,y2,val;
        in>>tip>>x1>>y1>>x2>>y2;

        switch (tip) {
        case 'u': {
            in>>val;
            update(x1,y1,x2,y2,val);

            break;
        }
        case 'q': {
            out<<query(x1,y1,x2,y2)<<'\n';

            break;
        }
        }
    }

    in.close();out.close();
    return 0;
}

#define brk; if (x1 > x2 || y1 > y2) {return;}

void update(int,int,int,int,int);
void hUpdate(int,int,int,int,int);
void vUpdate(int,int,int,int,int);
void sqUpdate(int,int,int,int,int);
int query(int x1,int y1,int x2,int y2) {
    brk;

    int i = x1;
    while (i)
}

int hQuery(int x1,int y1,int x2,int y2) {
    brk;

    int ans = 0;
    for (int i=x1;i <= x2;++i) {
        for (int j=y1;j <= y2;j += root) {
            int idx = (i-1)/root + 1,
                jdx = (j-1)/root + 1;

            int add = sqBit[idx][jdx];
            ans += hBit[i][jdx] + add;
        }
    }

    return ans;
}

int vQuery(int x1,int y1,int x2,int y2) {
    brk;

    int ans = 0;
    for (int i=x1;i <= x2;i += root) {
        for (int j=y1;j <= y2;++j) {
            int idx = (i-1)/root + 1,
                jdx = (j-1)/root + 1;

            int add = sqBit[idx][jdx];
            ans += vBit[idx][j] + add;
        }
    }

    return ans;
}

int sqQuery(int x1,int y1,int x2,int y2) {
    brk;

    int ans = 0;
    for (int i=x1;i <= x2;++i) {
        for (int j=y1;j <= y2;++j) {
            int idx = (i-1)/root + 1,
                jdx = (j-1)/root + 1;

            int add = hBit[i][jdx] + vBit[idx][j] + sqBit[idx][jdx];
            ans += a[i][j] + add;
        }
    }

    return ans;
}