結果

問題 No.2933 Range ROT Query
ユーザー Mohamed Thaer
提出日時 2025-05-15 04:27:54
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 2,419 bytes
コンパイル時間 1,110 ms
コンパイル使用メモリ 80,052 KB
実行使用メモリ 10,184 KB
最終ジャッジ日時 2025-05-15 04:28:12
合計ジャッジ時間 16,661 ms
ジャッジサーバーID
(参考情報)
judge4 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample WA * 2
other AC * 13 WA * 37
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class SegmentTree {
    vector<int> lazy;
    int size;
    
public:
    SegmentTree(int n) {
        size = n;
        lazy.resize(4 * n, 0);
    }
    
    void updateRange(int node, int start, int end, int l, int r, int val) {
        if (start > end || start > r || end < l)
            return;
            
        if (start >= l && end <= r) {
            lazy[node] = (lazy[node] + val) % 26;
            return;
        }
        
        int mid = (start + end) / 2;
        updateRange(2*node, start, mid, l, r, val);
        updateRange(2*node+1, mid+1, end, l, r, val);
    }
    
    int query(int node, int start, int end, int idx) {
        if (start > end)
            return 0;
            
        if (start == end) {
            return lazy[node];
        }
        
        int mid = (start + end) / 2;
        int rot = lazy[node];
        
        if (idx <= mid) {
            return (rot + query(2*node, start, mid, idx)) % 26;
        } else {
            return (rot + query(2*node+1, mid+1, end, idx)) % 26;
        }
    }
    
    void update(int l, int r, int val) {
        updateRange(1, 0, size-1, l-1, r-1, val);
    }
    
    int get(int idx) {
        return query(1, 0, size-1, idx-1);
    }
};

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    string S, T;
    cin >> S >> T;
    
    SegmentTree segS(S.length());
    SegmentTree segT(T.length());
    
    int Q;
    cin >> Q;
    
    while (Q--) {
        int queryType;
        cin >> queryType;
        
        if (queryType == 1) {
            int l, r, x;
            cin >> l >> r >> x;
            segS.update(l, r, x);
        }
        else if (queryType == 2) {
            int l, r, x;
            cin >> l >> r >> x;
            segT.update(l, r, x);
        }
        else if (queryType == 3) {
            int p;
            cin >> p;
            
            char actualS = 'a' + ((S[p-1] - 'a' + segS.get(p)) % 26);
            char actualT = 'a' + ((T[p-1] - 'a' + segT.get(p)) % 26);
            
            if (actualS > actualT) {
                cout << "Greater" << endl;
            }
            else if (actualS < actualT) {
                cout << "Lesser" << endl;
            }
            else {
                cout << "Equals" << endl;
            }
        }
    }
    
    return 0;
}
0