#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
typedef pair<int,int>pii;
const int mod = 1e9 + 7 , INF = 0x3f3f3f3f , N = 1e5 + 10;
struct edge
{
int l,r;
int v;
LL sum;
bool flag;
}tr[N * 4];
int w[N];
int n,m;
void push_up(int x)
{
tr[x].sum = tr[x << 1].sum + tr[x << 1 | 1].sum;
tr[x].flag = tr[x << 1].flag && tr[x << 1 | 1].flag;
}
void build(int x,int l,int r)
{
tr[x] = {l,r};
if (l == r)
{
tr[x] = {l,r,w[l],w[l]};
if (w[l] <= 2)
tr[x].flag = 1;
return;
}
int mid = l + r >> 1;
build(x << 1,l,mid);
build(x << 1 | 1,mid + 1,r);
push_up(x);
}
void update(int x,int l,int r)
{
if (tr[x].flag)
return;
if (tr[x].l == tr[x].r)
{
if (tr[x].v != 0)
tr[x].v = log2(tr[x].v) + 1;
tr[x].sum = tr[x].v;
if (tr[x].sum <= 2)
tr[x].flag = 1;
return;
}
int mid = tr[x].l + tr[x].r >> 1;
if (l <= mid)
update(x << 1,l,r);
if (r > mid)
update(x << 1 | 1 ,l,r);
push_up(x);
}
LL query(int x,int l,int r)
{
if (tr[x].l >= l && tr[x].r <= r)
return tr[x].sum;
int mid = tr[x].l + tr[x].r >> 1;
LL res = 0;
if (l <= mid)
res += query(x << 1,l,r);
if (r > mid)
res += query(x << 1,l,r);
return res;
}
int main()
{
cin >> n >> m;
for (int i = 1 ; i <= n ; i ++)
cin >> w[i];
build(1,1,n);
while (m --)
{
int a,b;
cin >> a >> b;
update(1,a,b);
cout << query(1,1,n) << endl;
}
return 0;
}
蓝桥杯 Log大虾【第五届】【决赛】【B组】
于 2022-03-26 22:18:23 首次发布