【线段树】单点更新5

/*****************************************

简单的单点更新,用一个c数组标记PushUp是应该OR还是XOR


****************************************/

Description

Xenia the beginner programmer has a sequence a, consisting of 2n non-negative integers: a1, a2, ..., a2n. Xenia is currently studying bit operations. To better understand how they work, Xenia decided to calculate some value v for a.

Namely, it takes several iterations to calculate value v. At the first iteration, Xenia writes a new sequence a1 or a2, a3 or a4, ..., a2n - 1 or a2n, consisting of 2n - 1 elements. In other words, she writes down the bit-wise OR of adjacent elements of sequence a. At the second iteration, Xenia writes the bitwise exclusive OR of adjacent elements of the sequence obtained after the first iteration. At the third iteration Xenia writes the bitwise OR of the adjacent elements of the sequence obtained after the second iteration. And so on; the operations of bitwise exclusive OR and bitwise OR alternate. In the end, she obtains a sequence consisting of one element, and that element is v.

Let's consider an example. Suppose that sequence a = (1, 2, 3, 4). Then let's write down all the transformations (1, 2, 3, 4) → (1 or 2 = 3, 3 or 4 = 7) → (3 xor 7 = 4). The result is v = 4.

You are given Xenia's initial sequence. But to calculate value v for a given sequence would be too easy, so you are given additional mqueries. Each query is a pair of integers p, b. Query p, b means that you need to perform the assignment ap = b. After each query, you need to print the new value v for the new sequence a.

Input

The first line contains two integers n and m(1 ≤ n ≤ 17, 1 ≤ m ≤ 105). The next line contains 2n integers a1, a2, ..., a2n(0 ≤ ai < 230). Each of the next m lines contains queries. The i-th line contains integers pi, bi(1 ≤ pi ≤ 2n, 0 ≤ bi < 230) — the i-th query.

Output

Print m integers — the i-th integer denotes value v for sequence a after the i-th query.

Sample Input

Input
2 4
1 6 3 5
1 4
3 4
1 2
1 2
Output
1
3
3
3
# include<cstdio>
# define lson l, m, rt<<1
# define rson m+1, r, rt<<1|1

using namespace std;

const int maxn=140000;

int a[maxn<<2];
int b[maxn<<2];
int c[maxn<<2];//记录该节点是应该OR还是XOR操作
int t;

void PushUp(int rt)
{
    if(c[rt<<1]){
        c[rt]=0;
    a[rt]=a[rt<<1]|a[rt<<1|1];
    }
    else
    {
        c[rt]=1;
        a[rt]=a[rt<<1]^a[rt<<1|1];
    }
}

void build(int l, int r, int rt)
{
    if(l==r){ scanf("%d", &a[rt]); b[t++]=rt; c[rt]=1; return;}
    int m=(l+r)>>1;
    build(lson);
    build(rson);
    PushUp(rt);
}

void updata(int l, int r, int rt, int x)
{
    if(l==r){return;}
    int m=(l+r)>>1;
    if(x<=m) updata(lson, x);
    else updata(rson, x);
    PushUp(rt);
}

int main()
{
    int n, m, p, w;
    while(scanf("%d%d", &n, &m)!=EOF)
    {
        int k=1<<n;
        t=1;
        build(1, k, 1);
        for(int i=0; i<m; i++)
        {
            scanf("%d%d", &p, &w);
            a[b[p]]=w;
            updata(1, k, 1, p);
            printf("%d\n", a[1]);
        }
    }

    return 0;
}




内容概要:本文档详细介绍了一个利用Matlab实现Transformer-Adaboost结合的时间序列预测项目实例。项目涵盖Transformer架构的时间序列特征提取与建模,Adaboost集成方法用于增强预测性能,以及详细的模型设计思路、训练、评估过程和最终的GUI可视化。整个项目强调数据预处理、窗口化操作、模型训练及其优化(包括正则化、早停等手段)、模型融合策略和技术部署,如GPU加速等,并展示了通过多个评估指标衡量预测效果。此外,还提出了未来的改进建议和发展方向,涵盖了多层次集成学习、智能决策支持、自动化超参数调整等多个方面。最后部分阐述了在金融预测、销售数据预测等领域中的广泛应用可能性。 适合人群:具有一定编程经验的研发人员,尤其对时间序列预测感兴趣的研究者和技术从业者。 使用场景及目标:该项目适用于需要进行高质量时间序列预测的企业或机构,比如金融机构、能源供应商和服务商、电子商务公司。目标包括但不限于金融市场的波动性预测、电力负荷预估和库存管理。该系统可以部署到各类平台,如Linux服务器集群或云计算环境,为用户提供实时准确的预测服务,并支持扩展以满足更高频率的数据吞吐量需求。 其他说明:此文档不仅包含了丰富的理论分析,还有大量实用的操作指南,从项目构思到具体的代码片段都有详细记录,使用户能够轻松复制并改进这一时间序列预测方案。文中提供的完整代码和详细的注释有助于加速学习进程,并激发更多创新想法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值