class Solution {
public:
    vector<int> platesBetweenCandles(string s, vector<vector<int>>& queries) {
        int n = s.size();
        vector<int> previousCandle(n, -1);      // Closest candle to the left
        vector<int> nextCandle(n, -1);          // Closest candle to the right
        vector<int> platePrefixSum(n + 1, 0);
        
        // Build previousCandle array (scan left to right)
        int lastCandle = -1;
        for(int i = 0; i < n; i++){
            if(s[i] == '|') lastCandle = i;
            previousCandle[i] = lastCandle;
        }
        
        // Build nextCandle array (scan right to left)  
        lastCandle = -1;
        for(int i = n - 1; i >= 0; i--){
            if(s[i] == '|') lastCandle = i;
            nextCandle[i] = lastCandle;
        }
        
        // Build prefix sum array - number of plates from 0 to i-1
        for(int i = 0; i < n; i++){
            platePrefixSum[i + 1] = platePrefixSum[i] + ((s[i] == '*') ? 1 : 0);
        }
        
        vector<int> result;
        for(auto &query: queries){
            int left = query[0], right = query[1];
            int leftCandle = nextCandle[left];        // First candle >= left
            int rightCandle = previousCandle[right];  // Last candle <= right
            
            if(leftCandle != -1 && rightCandle != -1 && leftCandle < rightCandle) {
                // Count plates between the two candles
                int plateCount = platePrefixSum[rightCandle] - platePrefixSum[leftCandle];
                result.push_back(plateCount);
            } else {
                result.push_back(0); 
            }
        }
        return result;
    }
};