#include <bits/stdc++.h>
#define int long long
using namespace std;
#define lson p << 1
#define rson p << 1 | 1
const int maxn = 2e5 + 5;
int m, n;
string s, x;
struct Node{
int add, mul;
}t[maxn * 4];
int ans[maxn];
// int lazy_add[maxn * 4]; // lazy_add[p]==k表示以p为祖先的结点还没加上k*区间长度
// int lazy_mul[maxn * 4]; // 表示以p为祖先还没乘上k
void push_up(int p)
{
t[p].mul = t[lson].mul * t[rson].mul;
t[p].add = t[lson].add * t[rson].mul + t[rson].add;
}
void build(int p, int l, int r)
{
if (l == r)
{
if(s[l] == 'A'){//A操作相当于x = -x - 1
t[p].mul = -1;
t[p].add = -1;
}
else{//B操作相当于x = x + 1
t[p].mul = 1;
t[p].add = 1;
}
return;
}
int mid = (l + r) >> 1;
build(lson, l, mid);
build(rson, mid + 1, r);
push_up(p);
}
Node combine(Node a, Node b){
Node res;
res.mul = a.mul * b.mul;
res.add = a.add * b.mul + b.add;
return res;
}
Node query(int p, int l, int r, int x, int y)
{
if (x <= l && y >= r)
{
return t[p];
}
int mid = (l + r) >> 1;
Node res = {0, 1};
if (x <= mid)
res = combine(res, query(lson, l, mid, x, y));
if (y >= mid + 1)
res = combine(res, query(rson, mid + 1, r, x, y));
return res;
}
int to_num(string s){
int res = 0;
for(int i = 0; s[i]; i++){
res = res * 2 + s[i] - '0';
}
return res;
}
string change(int x){
string s;
for(int i = m - 1; i >= 0; i--){
if((x >> i) & 1) s += '1';
else s += '0';
}
return s;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int q, i, j;
cin >> n >> q;
cin >> s;
s = ' ' + s;//右移!!!!
build(1, 1, n);
for(i = 1; i <= q; i++)
{
int l2, r2, l, r;
cin >> l >> r >> x;
m = x.size();
int num = to_num(x);
l2 = l, r2 = r;
//l = min((ans[i - 1] ^ l2) % n + 1, (ans[i - 1] ^ r2) % n + 1);
//r = max((ans[i - 1] ^ l2) % n + 1, (ans[i - 1] ^ r2) % n + 1);
Node res = query(1, 1, n, l, r);
num = num * res.mul + res.add;
cout << l << ' ' << r << ' ' << res.mul << ' ' << res.add << '\n';
string str = change(num);
cout << str << '\n';
ans[i] = to_num(str);
}
}
线段树(乘和加)
最新推荐文章于 2024-06-12 10:00:23 发布