Help me in solving LAZER problem

Problem link: Lasers Everywhere Practice Coding Problem - CodeChef
Status: Wrong Answer

Code:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define ld long double
//#define int long long
#define all(x) begin(x), end(x)
const int mod = 1e9+7;
const int maxn = 2e5+5;

int n, q;
int N, h;
int tree[8*maxn], inc[8*maxn], setval[8*maxn];

void build(){
    memset(tree, 0, sizeof tree);
    memset(inc, 0, sizeof inc);
    memset(setval, -1, sizeof setval);

    N = 1;
    while(N < n) N *= 2;
    h = sizeof(signed)*8 - __builtin_clz(N);
}

void applyInc(int i, ll val, int k){
    tree[i] += val*k;
    if(i >= N) return;
    
    if(setval[i] != -1){
        setval[i] += val;
        return;
    }
    inc[i] += val;
}
void applySet(int i, ll val, int k){
    tree[i] = val*k;
    if(i >= N) return; 
    
    setval[i] = val;
    inc[i] = 0;
}

void calc(int i, ll k){
    if(setval[i] != -1){
        tree[i] = setval[i]*k;
        return;
    }
    
    tree[i] = tree[2*i]+tree[2*i+1]+inc[i]*k;
}
void applyP(int x){
    x /= 2;
    for(int k = 2; x > 0; x /= 2, k *= 2){
        calc(x, k);
    }
}

void propagate(int x){
    for(int s = h, k = (1 << (h-1)); s > 0; s--, k /= 2){
        int i = x >> s;
        if(inc[i] != 0){
            applyInc(2*i, inc[i], k);
            applyInc(2*i+1, inc[i], k);
            inc[i] = 0;
        }
        if(setval[i] != -1){
            applySet(2*i, setval[i], k);
            applySet(2*i+1, setval[i], k);
            setval[i] = -1;
        }
    }
}

void increment(int l, int r, ll val){
    l += N;
    r += N;
    int l0 = l, r0 = r;
    
    propagate(l);
    propagate(r);

    for(int k = 1; l <= r; l /=2 , r /= 2, k *= 2){
        if(l%2 == 1) applyInc(l++, val, k);
        if(r%2 == 0) applyInc(r--, val, k);
    }
    
    applyP(l0);
    applyP(r0);
}

void setQ(int l, int r, ll val){
    l += N;
    r += N;
    int l0 = l, r0 = r;

    propagate(l);
    propagate(r);

    for(int k = 1; l <= r; l /= 2, r /= 2, k *= 2){
        if(l%2 == 1) applySet(l++, val, k);
        if(r%2 == 0) applySet(r--, val, k);
    }

    applyP(l0);
    applyP(r0);
}

ll query(int l, int r){
    l += N;
    r += N;
    
    propagate(l);
    propagate(r);

    ll sum = 0;
    for(; l <= r; l /= 2, r /= 2){
        if(l%2 == 1) sum += tree[l++];
        if(r%2 == 0) sum += tree[r--];
    }

    return sum;
}

signed main(){
    ios_base::sync_with_stdio(false); cin.tie(0);

    int t;
    cin >> t;
    while(t--){
        cin >> n >> q;
        
        map<int, int> table;
        map<int, int> first;

        vector<tuple<int, int, int, int, int, int>> events;
        vector<int> comp;
        int last;
        cin >> last;
        comp.push_back(last);
        for(int i = 0; i < n-1; i++){
            int u;
            cin >> u;
            events.push_back({i, 3, i+1, last, u, -1});
            comp.push_back(u);
            last = u;
        }
        for(int i = 0; i < q; i++){
            int x1, x2, y;
            cin >> x1 >> x2 >> y;
            x1--; x2--;
            events.push_back({x2, 1, x1, y, -1, i});
            events.push_back({x1, 2, -1, y, -1, -1});
            comp.push_back(y);
        }

        sort(all(comp));
        comp.resize(unique(all(comp)) - begin(comp));
        for(int i = 0; i < (int)(comp.size()); i++) table[comp[i]] = i;

        sort(all(events));
        build();

        vector<pair<int, int>> sol;
        for(int i = 0; i < (int)events.size(); i++){
            int s = get<1>(events[i]);

            if(s == 2){
                auto [x1, n1, n2, y, n3, n4] = events[i];
                y = table[y];
                first[x1] = query(y, y);
            }
            else if(s == 1){
                auto [x2, n1, x1, y, n2, indx] = events[i];
                y = table[y];
                sol.push_back({indx, query(y, y)-first[x1]});
            }
            else{
                auto [x1, n1, x2, y1, y2, n2] = events[i];
                y1 = table[y1];
                y2 = table[y2];
                if(y1 > y2) swap(y1, y2);
                increment(y1, y2, 1);
            }
        }

        sort(all(sol));
        for(auto [i, val] : sol) cout << val << '\n';
    }

    return 0;
}