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 <bits/stdc++.h>
using namespace std;
#define a first
#define b second
#define pb push_back
typedef long long llo;
#define endl '\n'
llo n,q;
llo it[200002];
llo pre6[200002];
int par[200002];
bool vis[200002];
llo fin[200002];
vector<int> adj[200002];
vector<pair<pair<int,int>,int>> pre[200002];
int ind[200002];
//llo pre[200002];
vector<int> pre3[200002];
vector<pair<int,int>> tt;
int ss[200002];
vector<int> pre4[200002];
void dfs(llo no){
vis[no]=1;
ss[no]=1;
for(auto j:adj[no]){
tt.pb({no,j});
par[j]=no;
dfs(j);
ss[no]+=ss[j];
pre3[j-no].pb(j);
pre4[(j-no)+ss[j]].pb(j);
}
}
llo tree[4*200002][2];
void update(llo no,llo l,llo r,llo i,llo aa,llo bb){
if(l==r){
tree[no][0]=aa;
tree[no][1]=-bb*aa;
}
else{
llo mid=(l+r)/2;
if(i<=mid){
update(no*2+1,l,mid,i,aa,bb);
}
else{
update(no*2+2,mid+1,r,i,aa,bb);
}
tree[no][0]=tree[no*2+1][0]+tree[no*2+2][0];
tree[no][1]=tree[no*2+1][1]+tree[no*2+2][1];
}
}
pair<llo,llo> query2(llo no,llo l,llo r,llo aa,llo bb){
if(r<aa or l>bb or aa>bb){
return {0,0};
}
if(aa<=l and r<=bb){
return {tree[no][0],tree[no][1]};
}
llo mid=(l+r)/2;
pair<llo,llo> x=query2(no*2+1,l,mid,aa,bb);
pair<llo,llo> y=query2(no*2+2,mid+1,r,aa,bb);
return {x.a+y.a,x.b+y.b};
}
vector<int> tree2[4*200002];
vector<llo> tree3[4*200002][2];
vector<int> ind2[4*200002];
int act[200002];
pair<llo,llo> val5[200002];
const int dd=4;
int ca[200002];
void build(llo no,llo l,llo r){
for(llo j=l;j<=r;j++){
if(tt.size()<=j){
continue;
}
tree2[no].pb(tt[j].b);
ind2[no].pb(-1);
}
int cur=1;
ca[no]=2;
while(cur<=r-l+1){
cur*=2;
ca[no]++;
}
sort(tree2[no].begin(),tree2[no].end());
for(llo j=1;j<=r-l+1;j+=dd){
tree3[no][0].pb(0);
tree3[no][1].pb(0);
}
tree3[no][0].pb(0);
tree3[no][1].pb(0);
for(llo j=0;j<tree2[no].size();j++){
ind2[no][ind[tree2[no][j]]-l]=j;
}
if(l<r){
llo mid=(l+r)/2;
build(no*2+1,l,mid);
build(no*2+2,mid+1,r);
}
}
void uu(llo no,llo i,pair<llo,llo> x){
while(i<tree3[no][0].size()){
tree3[no][0][i]+=x.a;
tree3[no][1][i]+=x.b;
i+=(i&-i);
}
}
pair<llo,llo> s2(llo no,llo i){
llo su=0;
llo su2=0;
while(i>0){
su+=tree3[no][0][i];
su2+=tree3[no][1][i];
i-=(i&-i);
}
return {su,su2};
}
void update3(llo no,llo l,llo r,llo i,pair<llo,llo> x){
llo xa=ind2[no][i-l];
//cout<<xa<<"::"<<endl;
/*if(i==3){
cout<<x.a<<"???????????????"<<xa<<endl;
}*/
uu(no,((xa+dd-1)/dd)+1,x);
if(l<r){
llo mid=(l+r)/2;
if(i<=mid){
update3(no*2+1,l,mid,i,x);
}
else{
update3(no*2+2,mid+1,r,i,x);
}
}
}
pair<llo,llo> query3(llo no,llo l,llo r,llo aa,llo bb,llo i){
if(r<aa or l>bb or aa>bb){
return {0,0};
}
if(aa<=l and r<=bb){
llo low=-1;
/* if(3>=l and 3<=r){
cout<<l<<"<"<<r<<endl;
for(auto jj:tree2[no]){
cout<<jj.a<<";;"<<jj.b<<endl;
}
}*/
for(llo j=ca[no];j>=0;j--){
if(low+(1<<j)<tree2[no].size()){
if(tree2[no][low+(1<<j)]<=i){
low+=(1<<j);
}
}
}
/* if(3>=l and 3<=r){
cout<<low<<"//"<<s2(no,low+1).a<<endl;
}*/
if(low==-1){
return {0,0};
}
pair<llo,llo> x=s2(no,(low/dd)+1);
for(int j=dd*(low/dd)+1;j<=low;j++){
if(act[ind[tree2[no][j]]]){
//cout<<val5[j].
x.a+=val5[ind[tree2[no][j]]].a;
x.b+=val5[ind[tree2[no][j]]].b;
}
}
return x;
// return s2(no,(low/4)+1);
}
else{
llo mid=(l+r)/2;
pair<llo,llo> xx=query3(no*2+1,l,mid,aa,bb,i);
pair<llo,llo> yy=query3(no*2+2,mid+1,r,aa,bb,i);
return {xx.a+yy.a,xx.b+yy.b};
}
}
llo tree4[4*200002];
llo lazy[4*200002];
void push(llo no,llo l,llo r){
tree4[no]+=lazy[no]*(r-l+1);
if(l<r){
lazy[no*2+1]+=lazy[no];
lazy[no*2+2]+=lazy[no];
}
lazy[no]=0;
}
void update2(llo no,llo l,llo r,llo aa,llo bb,llo x){
push(no,l,r);
if(r<aa or l>bb){
return;
}
if(aa<=l and r<=bb){
lazy[no]=x;
push(no,l,r);
}
else{
llo mid=(l+r)/2;
update2(no*2+1,l,mid,aa,bb,x);
update2(no*2+2,mid+1,r,aa,bb,x);
tree4[no]=tree4[no*2+1]+tree4[no*2+2];
}
}
llo query(llo no,llo l,llo r,llo aa,llo bb){
push(no,l,r);
if(r<aa or l>bb or aa>bb){
return 0;
}
if(aa<=l and r<=bb){
return tree4[no];
}
llo mid=(l+r)/2;
llo x=query(no*2+1,l,mid,aa,bb);
llo y=query(no*2+2,mid+1,r,aa,bb);
//tree4[no]=tree4[no*2+1]+tree4[no*2+2];
return x+y;
}
int ind9[200002];
llo solve(llo i,llo j){
llo low=-1;
if(j-i>=0 and j-i<=n){
low=ind9[j-i];
}
/*for(llo ii=19;ii>=0;ii--){
if(low+(1<<ii)<tt.size()){
if(tt[low+(1<<ii)].a<j-i){
low+=(1<<ii);
}
}
}*/
llo su=0;
if(low>=0){
pair<llo,llo> xx=query2(0,0,n-1,0,low);
// cout<<xx.a<<"????"<<endl;
su+=xx.b;
su+=xx.a*(i+1);
//cout<<su<<",,,"<<endl;
}
//cout<<low<<"??"<<endl;
if(low+1<tt.size()){
pair<llo,llo> yy=query3(0,0,n-1,low+1,n-1,j);
su+=yy.b;
su+=(j+1)*yy.a;
}
return su;
}
void setIO(string name) {
ios_base::sync_with_stdio(0); cin.tie(0);
freopen((name+".txt").c_str(),"r",stdin);
freopen((name+".out").c_str(),"w",stdout);
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
//setIO("02-02");
cin>>n>>q;
vector<pair<llo,llo>> ss5;
for(llo i=0;i<n;i++){
it[i]=n-i-1;
cin>>it[i];
pre6[i+1]=pre6[i]+it[i];
while(ss5.size()){
if(ss5.back().a<=it[i]){
ss5.pop_back();
}
else{
break;
}
}
if(ss5.size()){
adj[ss5.back().b].pb(i);
}
ss5.pb({it[i],i});
}
for(llo i=0;i<n;i++){
if(vis[i]==0){
dfs(i);
par[i]=-1;
}
}
sort(tt.begin(),tt.end());
for(int i=0;i<tt.size();i++){
for(int j=tt[i].a;j<tt[i+1].a;j++){
ind9[j]=i;
}
}
for(int j=tt.back().a;j<=n;j++){
ind9[j]=tt.size()-1;
}
/*for(int i=0;i+1<tt.size();i++){
assert(tt[i].b<=tt[i+1].b);
}*/
for(llo i=0;i<tt.size();i++){
ind[tt[i].b]=i;
}
for(llo ii=0;ii<q;ii++){
llo t,l,r;
cin>>t>>l>>r;
l--;
r--;
pre[t].pb({{l,r},ii});
}
build(0,0,n-1);
for(llo i=1;i<=n;i++){
//cout<<i<<":"<<endl;
for(auto j:pre3[i]){
// cout<<j<<",,"<<ind[j]<<endl;
llo x=it[par[j]]-it[j];
// cout<<j<<"+"<<endl;
update(0,0,n-1,ind[j],x,i);
act[ind[j]]=1;
val5[ind[j]]={x,-j*x};
update3(0,0,n-1,ind[j],{x,-j*x});
}
for(auto j:pre4[i]){
// cout<<j<<"-"<<endl;
//cout<<j<<"?"<<j+ss[j]-1<<"?"<<it[par[j]]-it[j]<<endl;
update2(0,0,n-1,j,j+ss[j]-1,it[par[j]]-it[j]);
update(0,0,n-1,ind[j],0,0);
llo x=it[par[j]]-it[j];
act[ind[j]]=0;
update3(0,0,n-1,ind[j],{-x,j*x});
}
for(auto jj:pre[i]){
pair<llo,llo> j=jj.a;
llo cur=pre6[j.b+1]-pre6[j.a];
//cout<<cur<<"::"<<endl;
cur+=query(0,0,n-1,j.a,j.b);
//continue;
//cout<<cur<<",,"<<endl;///<<tree4[0]<<endl;
cur+=solve(i,j.b);
if(j.a>0){
cur-=solve(i,j.a-1);
}
fin[jj.b]=cur;
}
}
for(llo i=0;i<q;i++){
cout<<fin[i]<<endl;
}
return 0;
}
Compilation message (stderr)
ho_t5.cpp: In function 'void build(llo, llo, llo)':
ho_t5.cpp:74:15: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'llo' {aka 'long long int'} [-Wsign-compare]
74 | if(tt.size()<=j){
| ~~~~~~~~~^~~
ho_t5.cpp:95:15: warning: comparison of integer expressions of different signedness: 'llo' {aka 'long long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
95 | for(llo j=0;j<tree2[no].size();j++){
| ~^~~~~~~~~~~~~~~~~
ho_t5.cpp: In function 'void uu(llo, llo, std::pair<long long int, long long int>)':
ho_t5.cpp:105:9: warning: comparison of integer expressions of different signedness: 'llo' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
105 | while(i<tree3[no][0].size()){
| ~^~~~~~~~~~~~~~~~~~~~
ho_t5.cpp: In function 'std::pair<long long int, long long int> query3(llo, llo, llo, llo, llo, llo)':
ho_t5.cpp:155:17: warning: comparison of integer expressions of different signedness: 'llo' {aka 'long long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
155 | if(low+(1<<j)<tree2[no].size()){
| ~~~~~~~~~~^~~~~~~~~~~~~~~~~
ho_t5.cpp: In function 'llo solve(llo, llo)':
ho_t5.cpp:247:10: warning: comparison of integer expressions of different signedness: 'llo' {aka 'long long int'} and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
247 | if(low+1<tt.size()){
| ~~~~~^~~~~~~~~~
ho_t5.cpp: In function 'int main()':
ho_t5.cpp:293:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
293 | for(int i=0;i<tt.size();i++){
| ~^~~~~~~~~~
ho_t5.cpp:305:15: warning: comparison of integer expressions of different signedness: 'llo' {aka 'long long int'} and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
305 | for(llo i=0;i<tt.size();i++){
| ~^~~~~~~~~~
ho_t5.cpp: In function 'void setIO(std::string)':
ho_t5.cpp:256:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
256 | freopen((name+".txt").c_str(),"r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ho_t5.cpp:257:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
257 | freopen((name+".out").c_str(),"w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |