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;
long long n,q;
long long kaf=(1<<19);
struct segment{
struct node{
long long sum,len,lazy,lazysum;
node(){
lazy=sum=len=lazysum=0;
}
};
node seg[(1<<20)];
void build(long long i){
if(i>=kaf){
seg[i].len=1;
return ;
}
build((i<<1));
build((i<<1)^1);
seg[i].len=seg[(i<<1)].len;
seg[i].len=seg[(i<<1)^1].len;
return ;
}
void calc(long long i){
if(i>=kaf){
seg[i].sum+=seg[i].lazysum;
seg[i].lazysum=0;
if(seg[i].lazy==1){
seg[i].lazy=0;
seg[i].sum=-seg[i].sum;
}
return;
}
long long fake=seg[(i<<1)].sum+seg[(i<<1)].lazysum*seg[(i<<1)].len;
if(seg[(i<<1)].lazy==1){
fake=-fake;
}
seg[i].sum=fake;
fake=seg[(i<<1)^1].sum+seg[(i<<1)^1].lazysum*seg[(i<<1)^1].len;
if(seg[(i<<1)^1].lazy==1){
fake=-fake;
}
seg[i].sum+=fake;
}
void shift(long long i){
if(i>=kaf){
return calc(i);
}
if(seg[i].lazysum==0&&seg[i].lazy==0){
return ;
}
if(seg[i].lazy==1){
seg[i].lazysum*=-1;
seg[(i<<1)].lazy^=1;
seg[(i<<1)^1].lazy^=1;
seg[i].lazy=0;
}
if(seg[(i<<1)].lazy==1){
seg[(i<<1)].lazysum-=seg[i].lazysum;
}
else{
seg[(i<<1)].lazysum+=seg[i].lazysum;
}
if(seg[(i<<1)^1].lazy==1){
seg[(i<<1)^1].lazysum-=seg[i].lazysum;
}
else{
seg[(i<<1)^1].lazysum+=seg[i].lazysum;
}
seg[i].lazysum=0;
}
void updsum(long long i,long long l,long long r,long long tl,long long tr,long long w){
if(l>r||l>tr||r<tl||tl>tr){
return ;
}
if(l>=tl&&r<=tr){
if(seg[i].lazy==1){
seg[i].lazysum-=w;
return ;
}
seg[i].lazysum+=w;
return ;
}
shift(i);
long long m=(l+r)>>1;
updsum((i<<1),l,m,tl,tr,w);
updsum((i<<1)^1,m+1,r,tl,tr,w);
calc(i);
}
void updmanf(long long i,long long l,long long r,long long tl,long long tr){
if(l>r||l>tr||r<tl||tl>tr){
return ;
}
if(l>=tl&&r<=tr){
seg[i].lazy^=1;
return ;
}
shift(i);
long long m=(l+r)>>1;
updmanf((i<<1),l,m,tl,tr);
updmanf((i<<1)^1,m+1,r,tl,tr);
calc(i);
}
long long pors(long long i,long long l,long long r,long long tl,long long tr){
if(l>r||l>tr||r<tl||tl>tr){
return 0;
}
shift(i);
calc(i);
if(l>=tl&&r<=tr){
if(l==r){
return seg[i].sum;
}
long long ret=seg[i].sum+seg[i].lazysum*seg[i].len;
if(seg[i].lazy==1){
ret=-ret;
}
return ret;
}
long long m=(l+r)>>1;
long long ret=pors((i<<1),l,m,tl,tr)+pors((i<<1)^1,m+1,r,tl,tr);
return ret;
}
}seg;
struct segr{
struct node{
long long res,av,akh,tedav,tedakh,ted,lazy;
node(){
res=ted=av=akh=tedav=tedakh=lazy=0;
}
};
node seg[(1<<20)];
void build(long long i){
if(i>=kaf){
seg[i].ted=1;
return ;
}
build((i<<1));
build((i<<1)^1);
seg[i].ted+=seg[(i<<1)].ted;
seg[i].ted+=seg[(i<<1)^1].ted;
}
node merge(node a,node b){
if(a.ted==0){
return b;
}
if(b.ted==0){
return a;
}
if(a.lazy==1){
a.av*=-1;
a.akh*=-1;
}
if(b.lazy==1){
b.av*=-1;
b.akh*=-1;
}
node ret;
ret.av=a.av;
ret.akh=b.akh;
ret.tedav=a.tedav;
ret.tedakh=b.tedakh;
if(a.tedav==a.ted&&b.av!=0&&b.av!=a.akh){
ret.tedav+=b.tedav;
}
if(b.tedakh==b.ted&&a.akh!=0&&b.av!=a.akh){
ret.tedakh+=a.tedakh;
}
ret.lazy=0;
ret.ted=a.ted+b.ted;
ret.res=a.res+b.res;
if(a.akh!=b.av){
ret.res+=a.tedakh*b.tedav;
}
return ret;
}
void calc(long long i){
if(i>=kaf){
if(seg[i].lazy==0){
return ;
}
seg[i].lazy=0;
seg[i].av*=-1;
seg[i].akh*=-1;
return ;
}
seg[i]=merge(seg[(i<<1)],seg[(i<<1)^1]);
}
void shift(long long i){
if(i>=kaf){
return calc(i);
}
if(seg[i].lazy==0){
return ;
}
seg[(i<<1)].lazy^=1;
seg[(i<<1)^1].lazy^=1;
seg[i].lazy=0;
return ;
}
void ins(long long i,long long l,long long r,long long tl,long long tr,long long w){
if(l>r||l>tr||r<tl||tl>tr){
return ;
}
if(l>=tl&&r<=tr){
//cout<<l<<" "<<r<<" "<<w<<"\n";
seg[i].lazy=0;
seg[i].av=seg[i].akh=w;
if(w!=0){
seg[i].res=seg[i].tedav=seg[i].tedakh=seg[i].ted=1;
}
else{
seg[i].res=seg[i].tedav=seg[i].tedakh=0;
seg[i].ted=1;
}
return ;
}
shift(i);
long long m=(l+r)>>1;
ins((i<<1),l,m,tl,tr,w);
ins((i<<1)^1,m+1,r,tl,tr,w);
calc(i);
}
void updmanf(long long i,long long l,long long r,long long tl,long long tr){
if(l>r||l>tr||r<tl||tl>tr){
return ;
}
if(l>=tl&&r<=tr){
seg[i].lazy^=1;
return ;
}
shift(i);
long long m=(l+r)>>1;
updmanf((i<<1),l,m,tl,tr);
updmanf((i<<1)^1,m+1,r,tl,tr);
return calc(i);
}
node alak;
node pors(long long i,long long l,long long r,long long tl,long long tr){
if(l>r||l>tr||r<tl||tl>tr){
return alak;
}
shift(i);
calc(i);
if(l>=tl&&r<=tr){
return seg[i];
}
long long m=(l+r)>>1;
return merge(pors((i<<1),l,m,tl,tr),pors((i<<1)^1,m+1,r,tl,tr));
}
long long solve(long long l,long long r){
return pors(1,0,kaf-1,l,r).res+r-l+2;
}
}segres;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
long long last=0;
seg.build(1);
segres.build(1);
for(long long i=1;i<=n;i++){
long long d;
cin>>d;
// cout<<i<<endl;
seg.updsum(1,0,kaf-1,i,i,d);
// cout<<i<<endl;
if(i>1){
if(d<last){
segres.ins(1,0,kaf-1,i-1,i-1,-1);
}
if(d==last){
segres.ins(1,0,kaf-1,i-1,i-1,0);
}
if(d>last){
segres.ins(1,0,kaf-1,i-1,i-1,1);
}
}
// cout<<i<<endl;
last=d;
}
for(long long i=0;i<q;i++){
char c;
cin>>c;
if(c=='?'){
long long l,r;
cin>>l>>r;
cout<<segres.solve(l,r-1)<<"\n";
}
else if(c=='*'){
long long vasl=0,vasr=0;
long long l,r;
cin>>l>>r;
seg.updmanf(1,0,kaf-1,l,r);
segres.updmanf(1,0,kaf-1,l,r-1);
long long wl=seg.pors(1,0,kaf-1,l,l),wll=seg.pors(1,0,kaf-1,l-1,l-1),wr=seg.pors(1,0,kaf-1,r,r),wrr=seg.pors(1,0,kaf-1,r+1,r+1);
if(wl>wll){
vasl=1;
}
else if(wl==wll){
vasl=0;
}
else{
vasl=-1;
}
if(wrr>wr){
vasr=1;
}
else if(wr==wrr){
vasr=0;
}
else{
vasr=-1;
}
if(l>1){
segres.ins(1,0,kaf-1,l-1,l-1,vasl);
}
if(r<n){
segres.ins(1,0,kaf-1,r,r,vasr);
}
}
else{
long long vasl=0,vasr=0;
long long l,r,w;
cin>>l>>r>>w;
seg.updsum(1,0,kaf-1,l,r,w);
long long wl=seg.pors(1,0,kaf-1,l,l),wll=seg.pors(1,0,kaf-1,l-1,l-1),wr=seg.pors(1,0,kaf-1,r,r),wrr=seg.pors(1,0,kaf-1,r+1,r+1);
if(wl>wll){
vasl=1;
}
else if(wl==wll){
vasl=0;
}
else{
vasl=-1;
}
if(wrr>wr){
vasr=1;
}
else if(wr==wrr){
vasr=0;
}
else{
vasr=-1;
}
if(l>1){
segres.ins(1,0,kaf-1,l-1,l-1,vasl);
}
if(r<n){
segres.ins(1,0,kaf-1,r,r,vasr);
}
}
}
}
# | 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... |