1 Star 0 Fork 0

KaiserWilheim/OI Codes

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
p3919.cpp 1.44 KB
一键复制 编辑 原始数据 按行查看 历史
KaiserWilheim 提交于 2022-06-15 14:11 +08:00 . 20220615
#include<bits/stdc++.h>
using namespace std;
const int N = 1000010, M = N;
int n, m;
struct node
{
int l, r;
int v;
}tr[(N << 2) + (M * 20)];
int root[M], idx = 0;
int a[N];
int build(int l, int r)
{
int p = ++idx;
if(l == r)
{
tr[p].v = a[r];
return p;
}
int mid = (l + r) >> 1;
tr[p].l = build(l, mid);
tr[p].r = build(mid + 1, r);
//tr[p].v = tr[tr[p].l].v + tr[tr[p].r].v;
return p;
}
int change(int p, int l, int r, int loc, int val)
{
int q = ++idx;
tr[q] = tr[p];
if(l == r)
{
tr[q].v = val;
return q;
}
int mid = (l + r) >> 1;
if(loc <= mid)tr[q].l = change(tr[p].l, l, mid, loc, val);
else tr[q].r = change(tr[p].r, mid + 1, r, loc, val);
//tr[q].v = tr[tr[q].l].v + tr[tr[q].r].v;
return q;
}
int search(int p, int l, int r, int loc)
{
if(l ==r)return tr[p].v;
int mid = (l + r) >> 1;
if(loc <= mid)return search(tr[p].l, l, mid, loc);
else return search(tr[p].r, mid + 1, r, loc);
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)scanf("%d", &a[i]);
root[1] = build(1, n);
root[0]++;
int op, ver, loc, val;
while(m--)
{
scanf("%d%d%d", &ver, &op, &loc);
ver++;
if(op == 1)
{
scanf("%d", &val);
root[++root[0]] = change(root[ver], 1, n, loc, val);
}
else if(op == 2)
{
printf("%d\n", search(root[ver], 1, n, loc));
root[++root[0]] = root[ver];
}
else
{
puts("Youwike AK IOI!");
}
}
return 0;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/kaiserwilheim/OIcodes.git
git@gitee.com:kaiserwilheim/OIcodes.git
kaiserwilheim
OIcodes
OI Codes
master

搜索帮助