This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "weirdtree.h"
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define elif else if
#define ep insert
using namespace std;
struct node{
ll mx1,mx2,sum,f;
};
const int NN=3e5+5;
ll n,a[NN];
node seg[4*NN+5];
map<int,set<int>> mp;
node merge(node x,node y){
int a[4]={x.mx1,x.mx2,y.mx1,y.mx2};
sort(a,a+4);
node z;
z.mx1=a[3];
if (a[2]==a[3]) z.mx2=a[1];
else z.mx2=a[2];
z.sum=x.sum+y.sum;
if (a[2]==a[3]) z.f=x.f+y.f;
elif (x.mx1>y.mx1) z.f=x.f;
else z.f=y.f;
return z;
}
void build(int x,int l,int r){
if (l==r){
seg[x]={a[l],0,a[l],1};
return;
}int mid=(l+r)/2;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
seg[x]=merge(seg[x*2],seg[x*2+1]);
return;
}
void edit(int x,int l,int r,int idx){
if (l==r){
seg[x]={a[l],0,a[l],1};
return;
}int mid=(l+r)/2;
if (idx<=mid) edit(x*2,l,mid,idx);
else edit(x*2+1,mid+1,r,idx);
seg[x]=merge(seg[x*2],seg[x*2+1]);
return;
}
node query(int x,int l,int r,int lx,int rx){
if (l>=lx && r<=rx) return seg[x];
if (l>rx || r<lx) return {INT_MIN,INT_MIN,0,0};
int mid=(l+r)/2;
return merge(query(x*2,l,mid,lx,rx),query(x*2+1,mid+1,r,lx,rx));
}
void initialise(int N, int Q, int h[]) {
n=N;
for (int i=1;i<=n;i++) a[i]=h[i],mp[a[i]].ep(i);
build(1,1,n);
return;
}
void cut(int l, int r, int kk) {
ll k=kk;
while (k>0){
node x=query(1,1,n,l,r);
ll mx1=x.mx1,mx2=x.mx2,f=x.f,d=(mx1-mx2);
if (!mx1) break;
if (k>=d*f){
while (true){
auto it=mp[mx1].lower_bound(l);
if (it==mp[mx1].end() || *it>r) break;
int i=*it;
mp[mx1].erase(it);
mp[mx2].ep(i);
a[i]=mx2;
edit(1,1,n,i);
}
k-=d*f;
continue;
}
int s=k/f+1;
for (int i=0;i<k%f;i++){
int j=*mp[mx1].lower_bound(l);
mp[mx1].erase(j);
mp[mx1-s].ep(j);
a[j]-=s;
edit(1,1,n,j);
}
s=k/f;
while (s){
auto it=mp[mx1].lower_bound(l);
if (it==mp[mx1].end()) break;
if (*it>r) break;
int j=*it;
mp[mx1].erase(it);
mp[mx1-s].ep(j);
a[j]-=s;
edit(1,1,n,j);
}break;
}
//for (int i=1;i<=n;i++) cout<<a[i]<<' ';
//cout<<endl;
return;
}
void magic(int i, int x) {
return;
}
long long int inspect(int l, int r) {
return query(1,1,n,l,r).sum;
}
Compilation message (stderr)
weirdtree.cpp: In function 'node merge(node, node)':
weirdtree.cpp:16:17: warning: narrowing conversion of 'x.node::mx1' from 'long long int' to 'int' [-Wnarrowing]
16 | int a[4]={x.mx1,x.mx2,y.mx1,y.mx2};
| ~~^~~
weirdtree.cpp:16:23: warning: narrowing conversion of 'x.node::mx2' from 'long long int' to 'int' [-Wnarrowing]
16 | int a[4]={x.mx1,x.mx2,y.mx1,y.mx2};
| ~~^~~
weirdtree.cpp:16:29: warning: narrowing conversion of 'y.node::mx1' from 'long long int' to 'int' [-Wnarrowing]
16 | int a[4]={x.mx1,x.mx2,y.mx1,y.mx2};
| ~~^~~
weirdtree.cpp:16:35: warning: narrowing conversion of 'y.node::mx2' from 'long long int' to 'int' [-Wnarrowing]
16 | int a[4]={x.mx1,x.mx2,y.mx1,y.mx2};
| ~~^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |