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;
}