您的位置:首页 > 产品设计 > UI/UE

Codeforces Round #250 (Div. 1) D. The Child and Sequence (线段树)

2016-04-10 12:18 525 查看
题目链接:http://codeforces.com/problemset/problem/438/D

给你n个数,m个操作,1操作是查询l到r之间的和,2操作是将l到r之间大于等于x的数xor于x,3操作是将下标为k的数变为x。

注意成段更新的时候,遇到一个区间的最大值还小于x的话就停止更新。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef __int64 LL;
const int MAXN = 1e5 + 5;
struct segtree {
int l , r;
LL sum , Min;
}T[MAXN << 2];
LL res;

void init(int p , int l , int r) {
int mid = (l + r) >> 1;
T[p].l = l , T[p].r = r;
if(l == r) {
scanf("%I64d" , &T[p].sum);
T[p].Min = T[p].sum;
return ;
}
init(p << 1 , l , mid);
init((p << 1)|1 , mid + 1 , r);
T[p].sum = T[p << 1].sum + T[(p << 1)|1].sum;
T[p].Min = (T[p << 1].Min > T[(p << 1)|1].Min ? T[p << 1].Min : T[(p << 1)|1].Min);
}

void updata(int p , int l , int r , LL x) {
int mid = (T[p].l + T[p].r) >> 1;
if(T[p].Min < x) {
return ;
}
if(T[p].l == T[p].r) {
T[p].Min %= x;
T[p].sum %= x;
return ;
}
if(r <= mid) {
updata(p << 1 , l , r , x);
}
else if(l > mid) {
updata((p << 1)|1 , l , r , x);
}
else {
updata(p << 1 , l , mid , x);
updata((p << 1)|1 , mid + 1 , r , x);
}
T[p].sum = T[p << 1].sum + T[(p << 1)|1].sum;
T[p].Min = (T[p << 1].Min > T[(p << 1)|1].Min ? T[p << 1].Min : T[(p << 1)|1].Min);
}

void updata2(int p , int index , LL x) {
int mid = (T[p].l + T[p].r) >> 1;
if(T[p].l == T[p].r && T[p].l == index) {
T[p].sum = T[p].Min = x;
return ;
}
if(index <= mid) {
updata2(p << 1 , index , x);
}
else {
updata2((p << 1)|1 , index , x);
}
T[p].sum = T[p << 1].sum + T[(p << 1)|1].sum;
T[p].Min = (T[p << 1].Min > T[(p << 1)|1].Min ? T[p << 1].Min : T[(p << 1)|1].Min);
}

void query(int p , int l , int r) {
int mid = (T[p].l + T[p].r) >> 1;
if(l == T[p].l && T[p].r == r) {
res += (LL)T[p].sum;
return ;
}
if(r <= mid) {
query(p << 1 , l , r);
}
else if(l > mid) {
query((p << 1)|1 , l , r);
}
else {
query(p << 1 , l , mid);
query((p << 1)|1 , mid + 1 , r);
}
}

int main()
{
int n , m , l , r , c;
LL x;
scanf("%d %d" , &n , &m);
init(1 , 1 , n);
while(m--) {
scanf("%d" , &c);
if(c == 1) {
scanf("%d %d" , &l , &r);
res = 0;
query(1 , l , r);
printf("%I64d\n" , res);
}
else if(c == 2) {
scanf("%d %d %I64d" , &l , &r , &x);
updata(1 , l , r , x);
//cout << query(1 , 4 , 4) << endl;
}
else {
scanf("%d %I64d" , &l , &x);
updata2(1 , l , x);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: