只有暴力分。。。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls p*2
#define rs p*2+1
const int N=4e6+7;
int sum[N],a[N],mx[N],ans,smx,f[N];
void read(int &x)
{
char ch=getchar();
int r=0,w=1;
while(!isdigit(ch))w=ch=='-'?-1:1,ch=getchar();
while(isdigit(ch))r=(r<<3)+(r<<1)+(ch^48),ch=getchar();
x=r*w;
}
void write(int x) {
char ch[20];
int len = 0;
if (x < 0)putchar('-'), x = -x;
while (x) {
ch[len++] = (x % 10) ^ 48;
x /= 10;
}
if(len==0)printf("0");
while (len--)putchar(ch[len]);
putchar('\n');
}
void update(int p)
{
sum[p]=sum[ls]+sum[rs];
mx[p]=max(mx[ls],mx[rs]);
}
void build(int p,int l,int r)
{
if(l==r)
{
sum[p]=a[l];
mx[p]=a[l];
return;
}
int mid=(l+r)/2;
build(ls,l,mid);
build(rs,mid+1,r);
update(p);
}
void query(int p,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
smx=max(smx,mx[p]);
ans+=sum[p];
return;
}
int mid=(l+r)/2;
if(x<=mid)query(ls,l,mid,x,y);
if(y>mid)query(rs,mid+1,r,x,y);
}
int lg(int x)
{
int ans=0;
while(x)
{
ans++;
x/=2;
}
return ans;
}
void add(int p,int l,int r,int x)
{
if(l==r)
{
int w=a[x];
a[x]=lg(a[x]);
sum[p]-=w-a[x];
mx[p]=a[x];
return;
}
int mid=(l+r)/2;
if(x<=mid)add(ls,l,mid,x);
else add(rs,mid+1,r,x);
update(p);
}
main()
{
int n,m;
read(n);read(m);
for(int i=1;i<=n;i++)
read(a[i]);
build(1,1,n);
while(m--)
{
int x,y;ans=smx=0;
read(x),read(y);
query(1,1,n,1,n);
if(smx>2)
{
for(int i=x;i<=y;i++)
add(1,1,n,i);
}
ans=smx=0;
query(1,1,n,1,n);
write(ans);
}
return 0;
}