# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1162159 | jj_master | Pyramids (IOI24_pyramids) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
void computePrefixSums(const vector<int>& A, vector<int>& prefixA, const vector<int>& B, vector<int>& prefixB, int N) {
prefixA[0] = 0;
prefixB[0] = 0;
for (int i = 0; i < N; ++i) {
prefixA[i + 1] = prefixA[i] + A[i];
prefixB[i + 1] = prefixB[i] + B[i];
}
}
bool canTransform(const vector<int>& A, const vector<int>& B, const vector<int>& prefixA, const vector<int>& prefixB, int L, int R, int X, int Y) {
if (R - L != Y - X) return false;
if (prefixA[R + 1] - prefixA[L] != prefixB[Y + 1] - prefixB[X]) {
return false;
}
for (int i = 0; i < (R - L); ++i) {
if (A[L + i + 1] - A[L + i] != B[X + i + 1] - B[X + i]) {
return false;
}
}
return true;
}
int main() {
int N, Q;
cin >> N;
vector<int> A(N), B(N);
for (int i = 0; i < N; ++i) {
cin >> A[i];
}
for (int i = 0; i < N; ++i) {
cin >> B[i];
}
vector<int> prefixA(N + 1), prefixB(N + 1);
computePrefixSums(A, prefixA, B, prefixB, N);
cin >> Q;
while (Q--) {
int L, R, X, Y;
cin >> L >> R >> X >> Y;
if (canTransform(A, B, prefixA, prefixB, L, R, X, Y)) {
cout << "YES\n";
} else {
cout << "NO\n";
}
}
return 0;
}