Cod sursa(job #2751041)

Utilizator HadircaDionisieHadirca Dionisie HadircaDionisie Data 13 mai 2021 23:05:14
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.27 kb
// Arbori_noduri_BST_Nebunii.cpp : This file contains the 'main' function. Program execution begins and ends there.
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>


using namespace std;

ifstream fin("baruri.in");
ofstream fout("baruri.out");

int n, m;
int segTree[4 * 100001];
/*
void build(int ind, int st, int dr) {
	if (st == dr) {
		segTree[ind] = xs[st];
		return;
	}

	int mid = (st + dr) / 2;
	build(2 * ind, st, mid);
	build(2 * ind + 1, mid + 1, dr);
	segTree[ind] = segTree[ind * 2] + segTree[ind * 2 + 1];
}*/

void create(int ind, int left, int right,int val,int pos)
{
	if (left == right)
	{
		segTree[ind] = val;
		return;
	}

	int mid = (left + right) / 2;
	if (pos <= mid) create(2 * ind, left, mid,val,pos);
	else              create(2 * ind + 1, mid + 1, right,val,pos);

	segTree[ind] = segTree[2 * ind] + segTree[2 * ind + 1];
}
int query(int ind, int st, int dr, int l, int r) {
	//inclus in interval
	if (st >= l && dr <= r) {
		return segTree[ind];
	}
	//Nu contribue cu nimic la query deci returnam INT_MIN pentru comparatie
	if (dr<l || st>r) {
		return 0;
	}
	//overlaps
	int mid = (st + dr) / 2;
	int left = query(2 * ind, st, mid, l, r);
	int right = query(2 * ind + 1, mid + 1, dr, l, r);
	return left + right;
}

void update(int ind, int st, int dr, int val, int pos,int op) {
	if (st == dr) {
		if (op == 1) {
			segTree[ind] -= val;
			return;
		}
		else if (op == 2) {
			segTree[ind] += val;
			return;
		}
	}
	int mid = (st + dr) / 2;
	if (pos <= mid) {
		update(2 * ind, st, mid, val, pos,op);
	}
	else {
		update(2 * ind + 1, mid + 1, dr, val, pos,op);
	}
	segTree[ind] = segTree[2 * ind] + segTree[2 * ind + 1];
}
int main()
{
	int e;
	int t;
	fin >> t;
	for (int i = 0; i < t; i++) {
		fin >> n;
		for (int i = 1; i <= n; i++) {
			fin >> e;
			create(1, 1, n, e, i);
		}

		fin >> m;

		//build(1, 1, n);

		int x, a, b, c;
		for (int i = 0; i < m; i++) {
			fin >> x >> a >> b;
			if (x == 0) {
				fout << query(1, 1, n, a+1, b+a) + query(1,1,n,a-b,a-1) << '\n';
			}
			else if (x == 2 || x == 1) {
				update(1, 1, n, a, b, x);
			}
			else {
				fin >> c;
				update(1, 1, n, a, b, 1);
				update(1, 1, n, a, c, 2);
			}
		}
	}
	return 0;
}