我的ac代码,应该是一个暴力求前缀0
应该可以被这类数据卡掉
n =3e5
q =3e5
a = 1 0 0 0 0 ......0 0 1
xi = 1 ,pi = 0
xi+1 = 1 ,pi+1 = 1
如此反复xi,pi和xi+1,pi+1
...
#include<unordered_map>
#include<algorithm>
#include<iostream>
#include<iomanip>
#include<utility>
#include<string>
#include<queue>
#include<cmath>
#include<stack>
#include<array>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pa;
const ll N = 1ll << 19, MOD = 1e9 + 7, INF = 0x7fffffffffffff;
const ll M = 1e9 + 7, MM = 1e9 + 9, B = 233;
class cmp {
public:
bool operator() (const pa& x, const pa& y)const {
if (x.second != y.second)return x.second > y.second;
else return x.first < y.first;
}
};
ll t, n, q;
vector<ll> c;
vector<vector<ll>> nxt;
ll ans;
void solve() {
cin >> n >> q;
deque<ll>a(n + 1, 0), pre(n + 1, 0);
vector<ll> tmpx(q + 1, 0), tmpp(q + 1, 0);
for (int i = 1; i <= n; i++) {
cin >> a[i];
//a[i] = rand() % (3000);
pre[i] = a[i];
}
ll cnt = 0;
//cout<<cnt<<'\n';
ll x, p;
ll cnt0 = 0, ind = 1;
while (q--) {
cin >> x >> p;
a[x] = p;
if (x == ind && p == 0) {
ind = x + 1;
}
if (x <= ind && p != 0) {
ind = x;
}
while (ind <= n && a[ind] == 0)ind++;
cnt0 = ind - 1;
ll l = 0, r = 50;
while (l < r) {
ll mid = (l + r) / 2;
if ((1ll << mid) >= (n - cnt0))r = mid;
else l = mid + 1;
}
cout << (1ll << l) % MOD << '\n';
}
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
t = 1;
// cin >> t;
while (t--) {
solve();
}
return 0;
}
/*
*/