Submission details
Task:Forest density
Sender:aalto26dm_001
Submission time:2026-09-21 16:49:36 +0300
Language:C++ (C++20)
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.00 sdetails
#2ACCEPTED0.59 sdetails
#3ACCEPTED0.58 sdetails

Code

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdint>
#include <bitset>
using namespace std;

long long xorTree(const vector<long long>& tree, long long a, long long b)
{
    long long n = tree.size() / 2;
    a--;
    b--;
    a += n;
    b += n;

    long long minVal = 0;
    while (a <= b)
    {
        if (a % 2 == 1)
        {
            minVal = minVal ^ tree[a++];
        }
        if (b % 2 == 0)
        {
            minVal = minVal ^ tree[b--];
        }
        a /= 2;
        b /= 2;
    }
    return minVal;
}

void add(vector<long long>& tree, long long k, long long u)
{
    k--;
    long long n = tree.size() / 2;
    k += n;
    tree[k] = u;
    for (k /= 2; k > 0; k /= 2)
    {
        tree[k] = min(tree[2 * k], tree[2 * k + 1]);
    }
}

int main()
{
    int n, q;
    cin >> n >> q;

    vector <vector<bool>> forest(n, vector<bool>(n, false));
    vector <vector<int>> prefixArray(n, vector<int>(n, 0));
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            char patch;
            cin >> patch;
            patch == '*' ? forest[i][j] = true : forest[i][j] = false;
        }
    }
    forest[0][0] ? prefixArray[0][0] = 1 : prefixArray[0][0] = 0;
    for (int i = 1; i < n; i++)
    {
        prefixArray[i][0] = prefixArray[i - 1][0] + forest[i][0];
        prefixArray[0][i] = prefixArray[0][i - 1] + forest[0][i];
    }
    for (int i = 1; i < n; i++)
    {
        for (int j = 1; j < n; j++)
        {
            prefixArray[i][j] = prefixArray[i - 1][j] + prefixArray[i][j - 1] + forest[i][j] - prefixArray[i - 1][j - 1];
        }
    }

    for (int i = 0; i < q; i++)
    {
        int r1, c1, r2, c2;
        cin >> r1 >> c1 >> r2 >> c2;
        r1--;
        c1--;
        r2--;
        c2--;
        int A, B, C, D;
        A = prefixArray[r2][c2];
        B = c1 - 1 < 0 ? 0 : prefixArray[r2][c1 - 1];
        C = r1 - 1 < 0 ? 0 : prefixArray[r1 - 1][c2];
        D = r1 - 1 < 0 || c1 - 1 < 0 ? 0 : prefixArray[r1 - 1][c1 - 1];
        cout << A - B - C + D << endl;
    }
}

Test details

Test 1

Verdict: ACCEPTED

input
10 100
**.*.*.**.
*.**.*..*.
.*****.**.
**....***.
...

correct output
10
14
5
7
8
...

user output
10
14
5
7
8
...

Test 2

Verdict: ACCEPTED

input
1000 200000
**.**.****..**.***..**.***.**....

correct output
41079
2824
15631
1548
8483
...

user output
41079
2824
15631
1548
8483
...

Test 3

Verdict: ACCEPTED

input
1000 200000
******************************...

correct output
1000000
1000000
1000000
1000000
1000000
...

user output
1000000
1000000
1000000
1000000
1000000
...