Submission
# | When | Author | Problem | Language | CPU | Memory | |
---|---|---|---|---|---|---|---|
7094 | 2023-03-03 02:22:34 | amirhozaifa | Range Equal Query | C++ 17 | 335 ms | 8352 kb | Accepted |
Test Cases
# | CPU | Memory | Points | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 10 ms | 5040 kb | 1 | Accepted | |||||||
2 | 10 ms | 5068 kb | 1 | Accepted | |||||||
3 | 11 ms | 5024 kb | 1 | Accepted | |||||||
4 | 11 ms | 4980 kb | 1 | Accepted | |||||||
5 | 12 ms | 4932 kb | 1 | Accepted | |||||||
6 | 11 ms | 5068 kb | 1 | Accepted | |||||||
7 | 11 ms | 5060 kb | 1 | Accepted | |||||||
8 | 11 ms | 5052 kb | 1 | Accepted | |||||||
9 | 132 ms | 8340 kb | 1 | Accepted | |||||||
10 | 135 ms | 8352 kb | 1 | Accepted | |||||||
11 | 200 ms | 8344 kb | 1 | Accepted | |||||||
12 | 204 ms | 8264 kb | 1 | Accepted | |||||||
13 | 335 ms | 8304 kb | 1 | Accepted | |||||||
14 | 196 ms | 8268 kb | 1 | Accepted | |||||||
15 | 132 ms | 8352 kb | 1 | Accepted | |||||||
16 | 142 ms | 8284 kb | 1 | Accepted | |||||||
17 | 133 ms | 8272 kb | 1 | Accepted | |||||||
18 | 203 ms | 8300 kb | 1 | Accepted | |||||||
19 | 254 ms | 8252 kb | 1 | Accepted | |||||||
20 | 196 ms | 8308 kb | 1 | Accepted | |||||||
Source Code
#include <bits/stdc++.h> using namespace std; #define F first #define S second typedef long long ll; const int MAX = 2e5 + 5; const int MOD[2] = {(int) 1e9 + 9, (int) 1e9 + 21}; const int pr[2] = {1000003, 1000033}; inline int add(int x, int y, int c) { return (x + y) % MOD[c]; } inline int sub(int x, int y, int c) { return (x - y + MOD[c]) % MOD[c]; } inline int mul(int x, int y, int c) { return (x * (ll) y) % MOD[c]; } int pw[2][MAX]; void precompute() { for (int c = 0; c < 2; c++) { pw[c][0] = 1; for (int i = 1; i < MAX; i++) pw[c][i] = mul(pw[c][i - 1], pr[c], c); } } pair<int, int> getHash(vector<int> &a) { pair<int, int> hs = {0, 0}; for (int i = 1; i < a.size(); i++) { hs.first = add(mul(hs.first, pr[0], 0), a[i], 0); hs.second = add(mul(hs.second, pr[1], 1), a[i], 1); } return hs; } int n; vector<int> a, b; pair<pair<int, int>,int> trN[4*MAX]; void combine(auto &trP,auto &trL,auto &trR){ int lsz=trL.S,rsz=trR.S; trP.F.F=add(mul(trL.F.F,pw[0][rsz],0),trR.F.F,0); trP.F.S=add(mul(trL.F.S,pw[1][rsz],1),trR.F.S,1); trP.S=lsz+rsz; } void init(int n,int l,int r){ if(l==r){ trN[n].F.F=trN[n].F.S=a[l]; trN[n].S=1; return; } int m=(l+r)/2; init(2*n,l,m); init(2*n+1,m+1,r); combine(trN[n],trN[2*n],trN[2*n+1]); } void update(int n,int l,int r,int i,int c){ if(i<l || r<i)return; if(i<=l && r<=i){ a[l]=c; trN[n].F.F=a[l]; trN[n].F.S=a[l]; return; } int m=(l+r)/2; update(2*n,l,m,i,c); update(2*n+1,m+1,r,i,c); combine(trN[n],trN[2*n],trN[2*n+1]); } pair<pair<int, int>,int> query(int n,int l,int r,int i,int j){ if(j<l || r<i) return {{0, 0},0}; if(i<=l && r<=j) return trN[n]; int m=(l+r)/2; auto trQL=query(2*n,l,m,i,j); auto trQR=query(2*n+1,m+1,r,i,j); pair<pair<int, int>,int> trP; combine(trP,trQL,trQR); return trP; } void solve(int cs) { int n, m; cin >> n >> m; a.clear(); a.push_back(0); for (int i = 1; i <= n; i++) { int x; cin >> x; a.push_back(x); } b.clear(); b.push_back(0); for (int i = 1; i <= m; i++) { int x; cin >> x; b.push_back(x); } auto hb = getHash(b); init(1,1,n); int q; cin >> q; while (q--) { int t; cin >> t; if (t == 1) { int i, v; cin >> i >> v; update(1,1,n,i,v); } else { int l, r; cin >> l >> r; auto ha = query(1,1,n,l,r).F; if (hb == ha) cout << "YES\n"; else cout << "NO\n"; } } } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); precompute(); int tc = 1; // cin >> tc; for (int cs = 1; tc--; cs++) solve(cs); return 0; }